Изменить цвет кнопки в делфи

Как изменить цвет TButton?

Содержание материала

Вы не можете изменить цвет стандартного TButton, так как кнопки управления окнами всегда рисует себя с

цвет кнопки определяется в панели управления. Но можно создать создать новый компонент TButton и ручка

и рисунок поведения есть.

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.

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

StdCtrls, Buttons, ExtCtrls;

TDrawButtonEvent = procedure (Control: TWinControl;

Rect: TRect; State: TOwnerDrawState) of object ;

TColorButton = class (TButton)

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);

constructor Create(AOwner: TComponent); override ;

destructor Destroy; override ;

property Canvas: TCanvas read FCanvas;

property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;

RegisterComponents( 'Samples' , [TColorButton]);

constructor TColorButton.Create(AOwner: TComponent);

procedure TColorButton.CreateParams( var Params: TCreateParams);

with Params do Style := Style or BS_OWNERDRAW;

procedure TColorButton.SetButtonStyle(ADefault: Boolean);

if ADefault <> IsFocused then

procedure TColorButton.CNMeasureItem( var Message : TWMMeasureItem);

with Message .MeasureItemStruct^ do

procedure TColorButton.CNDrawItem( var Message : TWMDrawItem);

with Message .DrawItemStruct^ do

Message .Result := 1 ;

procedure TColorButton.CMEnabledChanged( var Message : TMessage);

procedure TColorButton.CMFontChanged( var Message : TMessage);

procedure TColorButton.WMLButtonDblClk( var Message : TWMLButtonDblClk);

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

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

Flags, OldMode: Longint;

IsDown, IsDefault, IsDisabled: Boolean;

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

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

Читайте также:  Долгий вход в систему windows 10

InflateRect(Rect, — 1 , — 1 );

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

InflateRect(Rect, — 1 , — 1 );

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

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

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

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)

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

DT_SINGLELINE or DT_CENTER or DT_VCENTER);

if Assigned(FOnDrawButton) then

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

if IsFocused and IsDefault then

InflateRect(Rect, — 4 , — 4 );

В книгах Калверта, Свана и других авторов можно найти похожий текст. Смысл текста — «Изменить цвет кнопок Button, BitBtn нельзя, т.к. их рисует WINDOWS». Если нельзя, но ОЧЕНЬ НУЖНО, то можно.

Небольшой компонент ColorBtn, дает возможность использовать в кнопках цвет. Кроме того, представлено новое свойство — Frame3D, позволяющее получить более реалистичный вид нажатой кнопки. В отличие от API, при изменении значения свойства Frame3D, не требуется переоткрытие компонента.

Примечание. Кнопку по-прежнему рисует WINDOWS, а раскрашивает ее ColorBtn. Код компонента на 90% повторяет код BitBtn, ничего необычного здесь нет. Чаще заглядывайте в VCL — можно найти много интересного. На рисунке представлены ColorButton и ColorBitBtn.

  • Назад
  • Вперёд >>

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

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

Свойство Glyph

Свойство Glyph типа TBitmap определяет растровый рисунок кнопки. По умолчанию свойство Glyph имеет значение None, т. е. кнопка не содержит рисунок. Рисунок может содержать до трех отдельных изображений (глифов). Какое именно изображение выводится на кнопке, зависит от ее текущего состояния:

  • первое изображение отображается, если кнопка не нажата (по умолчанию);
  • второе изображение отображается, если кнопка неактивна и не может быть выбрана;
  • третье изображение отображается, когда кнопка нажата (выполнен щелчок).

Панель для выбора ресунков (скриншот выше) вызываеться по нажатию на кнопку с тремя точками ввозле свойства Glyph (скриншот ниже).

При использовании нескольких изображений они должны быть подготовлены и сохранены в одном файле растрового формата BMP. Подготовить рисунок для кнопки можно в графическом редакторе. (например с помощью редактора Image Editor, входящего в состав Delphi или Adobe Photoshop). Все отдельные изображения в рисунке должны располагаться без промежутков в горизонтальной строке и иметь одинаковую высоту и ширину (как правило, 16×16 пикселов). По умолчанию левый нижний пиксел каждого рисунка определяет фоновый цвет рисунка. Обычно ему задают цвет поверхности кнопки (значение clBtnFace), при этом все пикселы изображения, имеющие тот же цвет, будут не видны, т. е. являются прозрачными. По этой причине фоновый цвет также называют прозрачным. Если установить, например, желтый цвет фонового пиксела, то фон изображения тоже станет желтым.

Читайте также:  Два велосипедиста едут навстречу

Изменить режим отображения картинки в случае, когда фоновый цвет задается левым нижним пикселом рисунка, можно, установив значения его взаимосвязанных свойств TransparentColor и TransparentMode. Для восстановления режима отображения по умолчанию нужно установить свойство TransparentMode в значение tmAuto.

Используя рисунок с несколькими различными изображениями, можно при нажатии кнопки воспроизводить на ее поверхности простейшую анимацию. Для этого первое и третье изображения должны различаться не только цветом, но и видом и расположением фигур. Отметим, что для реализации более сложной анимации можно использовать компонент Animate, расположенный непосредственно на кнопке.

Cвойство NumGlyph

Количество изображений указывается в свойстве NumGlyph типа TNumGiyphs. По умолчанию свойство NumGlyph имеет значение 1, и на кнопке всегда отображается первое изображение.

Cвойство Kind

Delphi предлагает для кнопки BitBtn несколько предопределенных видов, выбираемых с помощью свойства Kind типа TBitBtnKind. При выборе какого-либо вида для кнопки на ней отображается соответствующий глиф. Для задания вида кнопки могут использоваться следующие константы:

  • bkCustom— на кнопке имеется выбранное изображение; первоначально изображение отсутствует, и его нужно загружать дополнительно;
  • bkOK — на кнопке имеются глиф «зеленая галочка» и текст ОК; свойство Default кнопки установлено в значение True, а свойство ModalResult — в значение mrOK;
  • bkCancel — на кнопке имеются глиф «красный знак х» и текст Cancel; свойство Cancel кнопки установлено в значение True, а свойство ModalResult— в значение
  • mrCancel;
  • bkYes— на кнопке имеются глиф «зеленая галочка» и текст Yes; свойство Default кнопки установлено в значение True, а свойство ModalResult — в значение mrYes;
  • bkNo — на кнопке имеются глиф «красная перечеркнутая окружность» и текст No; свойства Cancel кнопки установлено в значение True, а свойство ModalResult — в значение mrNO;
  • bkHelp— на кнопке имеются глиф «сине-зеленый вопросительный знак» и текст Help;
  • bkClose — на кнопке имеются глиф «дверь с обозначением выхода» и текст Close; при нажатии кнопки форма автоматически закрывается;
  • bkAbort — на кнопке имеются глиф «красный знак х» и текст Abort;
  • bkRetry— на кнопке имеются глиф «зеленая стрелка повтора операции» и текст Retry;
  • bkIgnore — на кнопке имеются глиф «игнорирование» и текст Ignore;
  • bkAll — на кнопке имеются глиф «двойная зеленая галочка» и текст Yes to All.
Читайте также:  Где печатать текст на компьютере виндовс 10

По умолчанию свойство Kind имеет значение bkCustom, и пользователь может сам выбирать изображение, управляя свойством. Не рекомендуется изменять свойство Glyph для предопределенных кнопок (например, для кнопки Close), т. к. в этом случае кнопка не будет выполнять закрепленные за ней действия (в данном случае закрытие окна).

Cвойство Layout

Расположением изображения на поверхности кнопки относительно текста управляет свойство Layout типа TButtonLayout, принимающее следующие значения:

  • blGlyphLeft (изображение слева от текста) — по умолчанию;
  • blGlyphRight (изображение справа от текста);
  • blGlyphTop (изображение над текстом);
  • blGlyphBottom (изображение под текстом).

Cвойство Margin

С помощью свойства Margin типа Integer можно управлять выравниванием глифа и текста относительно сторон кнопки. Это свойство задает расстояние в пикселах между стороной кнопки и изображением и по умолчанию имеет значение −1, что означает расположение глифа и текста по центру кнопки. Сторона, относительно которой производится выравнивание, определяется свойством Layout. Например, если значение Layout равно blGlyphLeft, то выравнивание выполняется по левой стороне кнопки.

На скриншоте показаны варианты выравнивания изображения и текста, соответствующие разным значениям свойства Margin.

Свойство Spacing

Свойство Spacing типа Integer определяет размер (в пикселах) промежутка, отделяющего глиф от текста. По умолчанию значение этого свойства равно 4 пикселам. Если значение этого свойства равно −1, то имеет место центрирование текста между краем глифа и дальней от него стороной кнопки.

На скриншоте показано использование различных значений свойства Spacing, отображенных в виде текста на кнопках.

Добрый день! Подскажите пожалуйста, почему не меняется цвет текста в TButton: изменил в дизайн-тайме Button3.Font.Color:= clBlue; , то же пробовал в ран-тайме — не помогло.

1 ответ 1

Ну вообще-то Button3.Font.Color:= clBlue; изменит только цвет надписи на кнопке. Ибо у button нет свойства цвета backgroud'a.

Cделай расширенный класс для TButton и ему сделай новое свойство color тогда сможешь изменять цвет.

Оцените статью
Adblock detector