Delphi как изменить цвет кнопки

Изменение цвета кнопки Delphi Решение и ответ на вопрос 690555

Как наверное и все новички когда-то, я просто хотел сделать калькулятор. Ну и уже заранее подумал, как бы сделать его красивее. Спасибо всем, опробую на выходных ваши советы.

Кстати, вот такой код нашел в интернете, якобы делает кнопку (в примере — желтого цвета). Если нужен кому, посмотрите.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//пример использования
procedure TForm1.FormCreate(Sender: TObject);
var
   NewButton   : TColoredButton;
begin
   NewButton:=TColoredButton.Create(Self);
   NewButton.Parent:=Panel4;
   NewButton.Color:=clYellow;
   NewButton.Caption:='Colored';
end;
 
//и сам класс
type
   TColoredButton=class(TButton)
   private
      FCanvas  : TControlCanvas;
      FColor: TColor;
 
      procedure SetColor(const Value: TColor);
 
      procedure Draw();
      procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
   public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
   published
      property Color: TColor read FColor write SetColor;
   end;
//-----------------------
constructor TColoredButton.Create(AOwner: TComponent);
begin
   inherited;
 
   FColor:=clBtnFace;
 
   FCanvas:=TControlCanvas.Create();
   FCanvas.Control:=Self;
end;
//-----------------------
destructor TColoredButton.Destroy();
begin
   FCanvas.Free();
   inherited;
end;
//-----------------------
procedure TColoredButton.SetColor(const Value: TColor);
begin
   FColor := Value;
   Invalidate();
end;
//-----------------------
procedure TColoredButton.Draw();
begin
   FCanvas.Brush.Color:=FColor;
   FCanvas.Brush.Style:=bsSolid;
   FCanvas.FillRect(Rect(2,2,Width-3,Height-3));
 
   FCanvas.Pen.Color:=clBlack;
   FCanvas.TextOut((Width-FCanvas.TextWidth(Caption)) div 2,
                   (Height-FCanvas.TextHeight(Caption)) div 2,
                   Caption);
end;
//-----------------------
procedure TColoredButton.WMPaint(var Message: TWMPaint);
begin
   inherited;
 
   Draw();
end;

Не знаю, работает ли, но сразу бросилось в глаза вот это:

Delphi
1
2
var
   NewButton   : TColoredButton;

Переменной дают тип TColoredButton, такого явно нет, компилятор тоже ругается.

 
Vetal ©
 
(2005-01-13 12:39)
[0]

Всем привет!

Казалось бы — что может быть проще, чем изменить цвет кнопки типа TButton в Delphi?
Ан нет… Не так все просто… Бьюсь уже второй час…
Подскажите пожалуйста как можно изменить цвет кнопки, не использую сторонних компонент?

Всем заранее спасибо!


 
ЮЮ ©
 
(2005-01-13 12:41)
[1]

Изменить оформление Windows. TButton в Delphi — это родная кнопка Windos — а они во всей системе одного цвета.


 
Neznaika ©
 
(2005-01-13 12:42)
[2]

TButton не изменишь!
Используй BitBtn или другие компоненты…


 
Vetal ©
 
(2005-01-13 12:54)
[3]

ЮЮ> Изменить оформление Windows не катит. Нужно изменить цвет только одной кнопки в приложении..

Neznaika>> Хорошо, а как можно изменить цвет кнопки, если она TBitBtn?


 
TButton ©
 
(2005-01-13 12:55)
[4]


> TButton не изменишь!

точно =)


 
Семен Сорокин ©
 
(2005-01-13 13:02)
[5]

Можно и у TButton:
MakeObjectInstance + FreeObjectInstance (или SetWindowLong), а также сообщения WM_ERASEBKGND/WM_PAINT

PS. ИМХО не стоит геморроя, проще использовать TBitBtn


 
TUser ©
 
(2005-01-13 13:15)
[6]


> TButton в Delphi — это родная кнопка Windos — а они во всей
> системе одного цвета

И тем не менее есть компоненты, которые изменяют стиль оформления программы, в т.ч. и цвет TButton»ов.


 
Vetal ©
 
(2005-01-13 13:23)
[7]

Так а как все-таки изменить цвет TBitBtn?


 
Neznaika ©
 
(2005-01-13 13:24)
[8]

>>Vetal ©   (13.01.05 12:54) [3]

Наложить картинку однотонную ;-)


 
Vetal ©
 
(2005-01-13 13:31)
[9]

Через свойство Glyph что ли?
Так по краям будет серенькое все…


 
Neznaika ©
 
(2005-01-13 13:38)
[10]

Vetal по-моему там все это регулируется, сейчас уже не помню как но у меня это получалось.


 
WhiteGuy ©
 
(2005-01-13 13:42)
[11]

Vetal,зайди на torry.net — там есть такие компоненты!! типa RbControls[RbButton]


 
Vetal ©
 
(2005-01-13 13:53)
[12]

Короче, сделал TPanel, заполнял его цвет… А по клину менял стиль с Uppered на Lowered и наоборот…


{

You cannot change the color of a standard TButton,

since the windows button control always paints itself with the

button color defined in the control panel.

But you can derive derive a new component from TButton and handle

the and drawing behaviour there.

}

unit ColorButton;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, ExtCtrls;

type

TDrawButtonEvent = procedure(Control: TWinControl;

   Rect: TRect; State: TOwnerDrawState) of object;

TColorButton = class(TButton)

private

   FCanvas: TCanvas;

   IsFocused: Boolean;

   FOnDrawButton: TDrawButtonEvent;

protected

   procedure CreateParams(var Params: TCreateParams); override;

   procedure SetButtonStyle(ADefault: Boolean); override;

   procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;

   procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;

   procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;

   procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;

   procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;

   procedure DrawButton(Rect: TRect; State: UINT);

public

   constructor Create(AOwner: TComponent); override;

   destructor Destroy; override;

   property Canvas: TCanvas read FCanvas;

published

   property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;

   property Color;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents(‘Samples’, [TColorButton]);

end;

constructor TColorButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

FCanvas := TCanvas.Create;

end;

destructor TColorButton.Destroy;

begin

inherited Destroy;

FCanvas.Free;

end;

procedure TColorButton.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

with Params do Style := Style or BS_OWNERDRAW;

end;

procedure TColorButton.SetButtonStyle(ADefault: Boolean);

begin

if ADefault <> IsFocused then

begin

   IsFocused := ADefault;

   Refresh;

end;

end;

procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);

begin

with Message.MeasureItemStruct^ do

begin

   itemWidth  := Width;

   itemHeight := Height;

end;

end;

procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);

var

SaveIndex: Integer;

begin

with Message.DrawItemStruct^ do

begin

   SaveIndex := SaveDC(hDC);

   FCanvas.Lock;

   try

     FCanvas.Handle := hDC;

     FCanvas.Font := Font;

     FCanvas.Brush := Brush;

     DrawButton(rcItem, itemState);

   finally

     FCanvas.Handle := 0;

     FCanvas.Unlock;

     RestoreDC(hDC, SaveIndex);

   end;

end;

Message.Result := 1;

end;

procedure TColorButton.CMEnabledChanged(var Message: TMessage);

begin

inherited;

Invalidate;

end;

procedure TColorButton.CMFontChanged(var Message: TMessage);

begin

inherited;

Invalidate;

end;

procedure TColorButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);

begin

Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));

end;

procedure TColorButton.DrawButton(Rect: TRect; State: UINT);

var

Flags, OldMode: Longint;

IsDown, IsDefault, IsDisabled: Boolean;

OldColor: TColor;

OrgRect: TRect;

begin

OrgRect := Rect;

Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;

IsDown := State and ODS_SELECTED <> 0;

IsDefault := State and ODS_FOCUS <> 0;

IsDisabled := State and ODS_DISABLED <> 0;

if IsDown then Flags := Flags or DFCS_PUSHED;

if IsDisabled then Flags := Flags or DFCS_INACTIVE;

if IsFocused or IsDefault then

begin

   FCanvas.Pen.Color := clWindowFrame;

   FCanvas.Pen.Width := 1;

   FCanvas.Brush.Style := bsClear;

   FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);

   InflateRect(Rect, — 1, — 1);

end;

if IsDown then

begin

   FCanvas.Pen.Color := clBtnShadow;

   FCanvas.Pen.Width := 1;

   FCanvas.Brush.Color := clBtnFace;

   FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);

   InflateRect(Rect, — 1, — 1);

end

else

   DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);

if IsDown then OffsetRect(Rect, 1, 1);

OldColor := FCanvas.Brush.Color;

FCanvas.Brush.Color := Color;

FCanvas.FillRect(Rect);

FCanvas.Brush.Color := OldColor;

OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);

FCanvas.Font.Color := clBtnText;

if IsDisabled then

   DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,

   ((Rect.Right — Rect.Left) — FCanvas.TextWidth(Caption)) div 2,

   ((Rect.Bottom — Rect.Top) — FCanvas.TextHeight(Caption)) div 2,

     0, 0, DST_TEXT or DSS_DISABLED)

else

   DrawText(FCanvas.Handle, PChar(Caption), — 1, Rect,

     DT_SINGLELINE or DT_CENTER or DT_VCENTER);

SetBkMode(FCanvas.Handle, OldMode);

if Assigned(FOnDrawButton) then

   FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));

if IsFocused and IsDefault then

begin

   Rect := OrgRect;

   InflateRect(Rect, — 4, — 4);

   FCanvas.Pen.Color := clWindowFrame;

   FCanvas.Brush.Color := clBtnFace;

   DrawFocusRect(FCanvas.Handle, Rect);

end;

end;

end.

Кнопка BitBtn отличается от обычной кнопки Button набором особых свойств, возможностью отображать надпись на кнопке в цвете и размещать на поверхности кнопки картинку.

Изменить цвет заголовка кнопки — свойство Caption.

Это можно сделать через свойство «Font.Color». Например, сделать надпись красной.

Вид кнопки.

Вид кнопки определяется свойством «Kind». Имеется следующий набор возможных вариантов:
bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bklgnore, bkAll.

В этих типах уже сделаны соответствующие надписи, введены пиктограммы, заданы еще некоторые свойства. Обычно все-таки лучше не пользоваться предопределёнными свойствами, так как это иногда приводит к странным результатам работы. Предпочтительно использовать кнопки с типом «bkCustom».

Надпись на кнопке.

Свойство Caption определяет надпись на кнопке.

Пусть «Caption=Открыть». Если написать «Caption=&Открыть», то на кнопке буква «О» окажется подчеркнутой.

Таким образом для кнопки задаётся «горячая клавиша». Теперь все равно – нажать ли на эту кнопку мышью, или нажать комбинацию клавиш «Alt + O».

Замечание. При этом раскладка должна быть на том языке, на котором сделана надпись. Также, если символ «О» набран в верхнем регистре, то «Alt + O» также надо набирать в верхнем регистре.

Уточним – символ «&» перед буквой задает горячую клавишу. Его можно поставить перед любой буквой слова, то есть не обязательно перед первой.

Например, в нашем случае это лучше сделать следующим образом:

«Caption=О&ткрыть». Тогда кнопка будет срабатывать при нажатии «Alt+т».

Если разместить компонент «Panel» (откуда взялась стрелка на кнопке — разберём позднее)

и написать код:

procedure TForm1.BitBtn4Click(Sender: Tobject);
begin
if Panel1.Visible = false then Panel1.Visible:=true
else Panel1.Visible:=false;
end;

то панель попеременно будет невидимой/видимой при каждом щелчке по кнопке или нажатии «Alt+т» (то есть код работает как переключатель).

Свойство Cancel.

По умолчанию оно равно «False». Если же его установить в «True», нажатие кнопки «Esc» будет выполнять то же действие, что и само нажатие на эту кнопку. Это свойство желательно изменять для кнопок «Отменить» в разных диалоговых окнах.

Свойство Default.

Если его установить в True, то кнопка становится главной. При нажатии на «Enter», это будет эквивалентно нажатию на данную кнопку, даже если в этот момент в фокусе находится какой-то оконный компонент.

Исключение – если в этот момент в фокусе будет другая кнопка, то нажатие на «Enter» вызовет все же обработчик события той кнопки, что была в фокусе.

Свойство ModalResult.

Это свойство иногда используется в модальных формах. По умолчанию оно равно «mrNone», то есть, ничего.

Однако вы можете выбрать любое значение из списка. Предположим, в модальной форме вы установили три кнопки: «Да», «Нет» и «Отмена». Тогда в свойстве «ModalResult»этих кнопок вы можете установить значения «mrYes», «mrNo»и «mrCancel».

При этом обработчик события для этих кнопок создавать не нужно – нажатие на любую кнопку закроет форму. При этом, в момент закрытия модальной формы, свойству «ModalResult»этой формы запишется значение «ModalResult» той кнопки, которая закрыла форму.

 Свойство Glyph. 

Это свойство типа «TBitmap», позволяющее привязать растровое изображение к кнопке.

Выводимый рисунок может содержать до трех отдельных изображений. Какое именно изображение из трех выводится, зависит от текущего состояния кнопки:

1–е изображение отображается, если кнопка не нажата (по умолчанию);

2-е изображение отображается тогда, когда кнопка не активна (свойство «Enabled=false») и не может быть выбрана;

3-е изображение отображается в том случае, если кнопка нажата (выполнен щелчок).

Замечание. Для особой кнопки с фиксацией добавляется ещё четвёртое изображение.

Число пиктограмм отображается в значении свойства «NumGlyphs».

Итак, изображение на кнопке установливается с помощью свойства Glyph.

(Изображение может, например, быть загружено из файла, поставляемого с Dephi и находящегося в program files common files borland shared Images Buttons.)

Но мы создадим bitmap матрицу размером 48*16 самостоятельно в графическом редакторе. Она будет состоять из трех примыкающих друг к другу матриц 16*16.

Замечание. В случае одинаковых размеров матриц значение «NumGlyphs» определяется автоматически.

Создадим следующее изображение:

Загрузим его с помощью свойства «Glyph». Тогда кнопка приобретёт вид:

Если свойство кнопки «Enabled=False», то вид кнопки изменится на:

И, наконец, при щелчке по кнопке изображение станет:

Расположение изображения и надписи.

Положение изображения на поверхности кнопки определяются свойствами Margin, Layout и Spacing.

Если свойство Margin равно «-1» (значение по умолчанию), то изображение вместе с надписью размещаются в центре кнопки. Приэтом значение «Layout» определяет, где по отношению к надписи будет располагаться изображение — слева, справа, сверху или снизу..

Если же, например, Margin=5 и Layout=blGlyphLeft, то расположение изображения и кнопки координируются от левого края.

Если Layout=blGlyphRight и Margin=20, то расположение изображения и кнопки координируются от правого края:

Анологично для других значений «Layout».

Свойство Spacing задает число пикселов, разделяющих изображение и надпись на поверхности кнопки. По умолчанию «Spacing = 4.» Если задать «Spacing = 0», изображение и надпись будут размещены вплотную друг к другу. Если задать «Spacing = -1», то текст появится посередине между изображением и краем кнопки.

***

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Delphi unknown error during init delphi
  • Delphi try except error
  • Delphi thread error неверный дескриптор 6
  • Delphi socket error 11004
  • Delphi socket error 11001

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии