Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Кнопки


Автор: kирилл 13.6.2006, 12:50
Подскажите, как сделать подобную кнопку без применения экзотики (по-моему, можно сделать из SpeedBar, но как)?

user posted image


M
Girder
Название темы должно отражать ее суть!


  

Автор: comtat 13.6.2006, 13:28
Вариантов много вот несколько :
1. Можно через PopupMenu
2. можно через ToolBar 
    создав кнопку Button и свойстве Style выбрать tbsDropDown 

Автор: kирилл 13.6.2006, 13:42
Цитата(comtat @  13.6.2006,  13:28 Найти цитируемый пост)
1. Можно через PopupMenu


Это меню показывается при щелчке правой кнопкой мыши

Цитата(comtat @  13.6.2006,  13:28 Найти цитируемый пост)
2. можно через ToolBar 
    создав кнопку Button и свойстве Style выбрать tbsDropDown  


На TButton свойства style не нашел. Да и делать один тулбар поверх другого - не лучший выход. Какие есть еще варианты?
 

Автор: comtat 13.6.2006, 13:47
Ставишь на форму ToolBar
Нажимаешь правой кнопкой на нем вылазит меню
выбираешь New Button
в его свойствах находишь Style а том уж и  tbsDropDown  

Автор: kирилл 13.6.2006, 14:48
ToolBar я ставить не хочу, т.к. он не держит стиль XP, и тулбар становиться одноцветным и выделяется. 

Автор: z-END 13.6.2006, 14:59
Цитата(kирилл @  13.6.2006,  15:48 Найти цитируемый пост)
ToolBar я ставить не хочу, т.к. он не держит стиль XP, и тулбар становиться одноцветным и выделяется.

а у тебя на скринщоте именно он и есть... 

Автор: kирилл 13.6.2006, 15:05
Цитата(z-END @  13.6.2006,  14:59 Найти цитируемый пост)
а у тебя на скринщоте именно он и есть... 

У меня в винде настроено отображение в классическом стиле. Но я не думаю, что так всем нравится, поэтому необходимо, чтобы мои усилия по созданию панели в стиле WinXP не оказались напрасными...  

Автор: comtat 13.6.2006, 15:13
Цитата
ToolBar я ставить не хочу, т.к. он не держит стиль XP, и тулбар становиться одноцветным и выделяется. 

Ну тогда используй ActionManager, XPColorMap и ActionToolBar

Могу пример кинуть ... 

Автор: z-END 13.6.2006, 15:14
Ты уж определись чего ты хочешьsmile
Цитата(kирилл @  13.6.2006,  13:50 Найти цитируемый пост)
Подскажите, как сделать подобную кнопку без применения экзотики

Цитата(kирилл @  13.6.2006,  16:05 Найти цитируемый пост)
Но я не думаю, что так всем нравится, поэтому необходимо, чтобы мои усилия по созданию панели в стиле WinXP не оказались напрасными... 

 

Автор: kирилл 13.6.2006, 15:22
Цитата(z-END @  13.6.2006,  15:14 Найти цитируемый пост)
Ты уж определись чего ты хочешь

Компонент без экзотики необходим для сохранения стиля WinXP.

Цитата(comtat @  13.6.2006,  15:13 Найти цитируемый пост)
Ну тогда используй ActionManager, XPColorMap и ActionToolBar

Могу пример кинуть ... 


Буду очень признателен, если скинешь на адресс ok<at>mne<dot>ru 

Автор: comtat 13.6.2006, 15:34
Короче берешь ActionManager, XPColorMap и ActionToolBar
и настраиваешь стиль под то что ты хошешь
так как ты считаешь, что должен выглядеть стиль XP

Удачи  smile  

Автор: kирилл 13.6.2006, 15:37
Под "стиль ХР" имею ввиду переливаемость тулбара в ИЕ (он вначале светлый, а в конце темнее) 

Автор: comtat 13.6.2006, 15:48
Так всего лишь градиентная заливка нужна ?? 

Автор: kирилл 13.6.2006, 15:57
Да, но начальный и конечный цвета заранее не известны 

Автор: z-END 13.6.2006, 16:04
кстати, а разве тулбар XPmainfest не понимает?! 

Автор: kирилл 13.6.2006, 19:08
Цитата(z-END @  13.6.2006,  16:04 Найти цитируемый пост)
кстати, а разве тулбар XPmainfest не понимает?! 

Вроде нет. Он монотонен. Но там вроде была прозрачность... Позже посмотрю. 

Автор: kирилл 13.6.2006, 22:13
C ToolBar ничего не получается - он монотонного серого цвета 

Автор: skyboy 13.6.2006, 22:46
в пакете компонентов http://jvcl.sourceforge.net/ на закладке buttons есть компонент arrowedbutton. Точь-в-точь, как тот, что на рисунке у тебя в первом посте.  

Автор: kирилл 14.6.2006, 11:16
skyboy, пакет jedi-vcl у меня не установился.


comtat, спасибо за исходники, но мне нужны не кнопки с подсветкой, а чтобы сама панель была с левой стороны одного цвета, с правой другого, а между ними градиентный переход.

Кто-нибудь знает, как сделать такой переход для компонента ToolBar?   

Автор: Snowy 14.6.2006, 11:36
Код

procedure MultiGradientRect(Canvas: TCanvas; Rect:TRect; const col: array of TColor); // рисует градиент
var
  i, cl, dx, gk: integer;
  cx1, cx2, ci:  integer;
begin
  gk := Length(col)-1; dx := Rect.Right - Rect.Left;
  for i := Rect.Left to Rect.Right - 1 do
  begin
    ci := (i-Rect.Left) * gk div dx;
    cx1 := ci * dx div gk;
    cx2 := (ci+1) * dx div gk - cx1;
    cl := (i - Rect.Top - cx1);
    cl := RGB((((cx2-cl)*GetRValue(col[ci]) + cl*GetRValue(col[ci+1])) div cx2),
              (((cx2-cl)*GetGValue(col[ci]) + cl*GetGValue(col[ci+1])) div cx2),
              (((cx2-cl)*GetBValue(col[ci]) + cl*GetBValue(col[ci+1])) div cx2));
    Canvas.Pen.Color := cl;
    Canvas.PenPos := Point(i, Rect.Top);
    Canvas.LineTo(i, Rect.Bottom);
  end;
end;
© Я.

Сделай вызов этой процедуры в OnPaint.
В OnResize пропиши Invalidate;
У formы установи DoubleBufered в true.
Пример использования:
Код
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True; // устанавливаем DoubleBuffered
end;

procedure TForm1.ToolBar1CustomDraw(Sender: TToolBar; const ARect: TRect; var DefaultDraw: Boolean);
begin // градиент на тулбаре
  MultiGradientRect(Sender.Canvas, ARect, [clBlue, clGreen, clYellow]);
end;

procedure TForm1.ToolBar1Resize(Sender: TObject);
begin // обновляем при ресайзе
  TToolBar(Sender).Invalidate;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin // градиент на форме
  MultiGradientRect(Canvas, ClientRect, [clBlue, clYellow, clRed, clMoneyGreen]);
end;

procedure TForm1.FormResize(Sender: TObject);
begin // обновляем при ресайзе
  Invalidate;
end;


В третий параметр можешь указать 2 и более цветов для градиента. 

Автор: skyboy 14.6.2006, 11:43
kирилл, как это - "не установился"? ты "ридми.тхт" читал? надо в vcl\examples\installhelper запустить проект, скомпилировать, он сам всё установит... 

Автор: kирилл 14.6.2006, 11:57
Цитата(Snowy @  14.6.2006,  11:36 Найти цитируемый пост)
MultiGradientRect(Canvas, ClientRect, [clBlue, clYellow, clRed, clMoneyGreen]);

На этой строке выдает ошибку (неизвестный идентификатор). Поиск в google ничего не дал... (по-моему в D2005 Canvas вообще нет) 

Автор: Snowy 14.6.2006, 12:08
Первый код поставь выше.
А Canvas не может не быть - это основа. 

Автор: kирилл 14.6.2006, 12:20
Не катит. Создаю новое VCL Forms Application, вставляю часть кода. Результат:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 DoubleBuffered := True;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 MultiGradientRect(Canvas, ClientRect, [clBlue, clYellow, clRed, clMoneyGreen]);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 Invalidate;
end;

end.


Запускаю, выдает ошибку "Undeclared identifer: 'MultiGradientRect'" 

Автор: Snowy 14.6.2006, 13:23
Ясен перец.
После {$R *.dfm} вставь процедуру
Цитата(Snowy @  14.6.2006,  11:36 Найти цитируемый пост)
procedure MultiGradientRect(Canvas: TCanvas; Rect:TRect; const col: array of TColor); // рисует градиент

который я привёл выше.
Вот же он - первый в этом посте: http://forum.vingrad.ru/index.php?showtopic=100247&view=findpost&p=762589
А ты только второй код взял.

Добавлено @ 13:25 
Прочитай этот пост 3 раза.
1-й код - процедура
2-й пример использования.
Ты взял пример использования, а чего использовать - не взял...
Вот и не работает. 

Автор: kирилл 16.6.2006, 12:56
Snowy, Всавил код, все работает, заливает, кроме одного smile - он заливает только черным цветом!  

Автор: Snowy 16.6.2006, 14:17
Проверил, перепроверил - всё работает.
Попробуй создать приложение с нуля и добавить этот код, ничего не перенастраивая.
Если не сработает - выкладывай.

P.S. какая версия дельфей? 

Автор: kирилл 16.6.2006, 17:22
Если приложение с нуля - то все отлично работает. А долбынный тулбар заливается черным smile 

Автор: Snowy 16.6.2006, 17:26
У тулбара нужно не в OnPaint писать, а в OnCustomDraw. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)