Как наверное и все новички когда-то, я просто хотел сделать калькулятор. Ну и уже заранее подумал, как бы сделать его красивее. Спасибо всем, опробую на выходных ваши советы.
Кстати, вот такой код нашел в интернете, якобы делает кнопку (в примере — желтого цвета). Если нужен кому, посмотрите.
Delphi | ||
|
Не знаю, работает ли, но сразу бросилось в глаза вот это:
Delphi | ||
|
Переменной дают тип 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», то текст появится посередине между изображением и краем кнопки.
***