Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как изменить цвет шрифта в TButton с использованием BS_OWNERDRAW и подклассирования в Delphi?

Delphi , Графика и Игры , Шрифты

 

Задача изменения цвета шрифта в TButton в Delphi, особенно при использовании стилей, таких как bsSplitButton, может быть непростой. Стандартные способы изменения цвета шрифта не всегда работают, особенно когда используются стилизованные кнопки. Пользователь davornik столкнулся с этой проблемой и ищет решение, не требующее полной перерисовки кнопки.

Проблема:

Попытка изменить цвет шрифта в TButton с использованием BS_OWNERDRAW и подклассирования (subclassing) не приводит к желаемому результату. Код, предложенный пользователем, не изменяет цвет шрифта кнопки.

Предложенное решение (изначальное):

Предложенное решение заключается в использовании подклассирования окна кнопки (subclassing) и перехватывании сообщения WM_DRAWITEM. В процедуре подкласса, при получении сообщения WM_DRAWITEM, цвет шрифта устанавливается в красный (clRed). Это решение требует полной перерисовки кнопки, что может быть нежелательно.

type
  TMyButton = class(TButton)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

function ButtonSubclassProc(
    hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM; 
    uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): LRESULT; stdcall;

var
  btnFntClr: TMyButton;
...

function ButtonSubclassProc(
     hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM; 
     uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): LRESULT; stdcall;
begin
  case uMsg of
    WM_DRAWITEM: TMyButton(dwRefData).Font.Color := clRed;
    WM_NCDESTROY: RemoveWindowSubclass(hWnd, @ButtonSubclassProc, uIdSubclass);
  end;
  Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;

procedure TMyButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;

Альтернативное решение: Использование стилизованных элементов и отключение стандартной отрисовки

Предложенное пользователем PeterBelow альтернативное решение, которое является более предпочтительным, заключается в использовании возможностей стилизованных кнопок Delphi. Если приложение настроено на использование пользовательских стилей (например, Windows 10), можно отключить стандартную отрисовку шрифта, установив свойство StyleElements.seFont в False. В этом случае, цвет шрифта можно будет изменить напрямую через свойство Font.Color кнопки.

Это решение позволяет избежать сложного подклассирования и перерисовки кнопки, сохраняя при этом стилизованный внешний вид.

procedure TForm1.FormCreate(Sender: TObject);
begin
  btnFntClr:=TMyButton.Create(Form1);
  btnFntClr.Parent:=Form1;
  btnFntClr.Style:=TCustomButton.TButtonStyle.bsSplitButton;
  btnFntClr.Caption:='Options';
  with btnFntClr do begin
    Left:=10;
    Top:=10;
    Width:=120;
    Font.Color := clBlue; // Изменение цвета шрифта напрямую
    StyleElements.seFont := False; // Отключение стандартной отрисовки шрифта
  end;
end;

Объяснение:

  • StyleElements.seFont := False; – Этот параметр сообщает системе, что отрисовка шрифта должна быть отключена, и мы будем контролировать его отображение самостоятельно.
  • Font.Color := clBlue; – После отключения стандартной отрисовки, изменение свойства Font.Color напрямую повлияет на цвет шрифта кнопки.

Преимущества альтернативного решения:

  • Простота: Решение значительно проще, чем использование подклассирования и перехвата WM_DRAWITEM.
  • Совместимость со стилями: Решение полностью совместимо с использованием стилизованных кнопок Delphi.
  • Производительность: Отсутствие перерисовки кнопки повышает производительность приложения.

Заключение:

Хотя подклассирование и перехват WM_DRAWITEM могут быть полезны в некоторых случаях, для простой задачи изменения цвета шрифта в TButton с использованием стилизованных кнопок, использование свойства StyleElements.seFont и прямого изменения Font.Color является более эффективным и предпочтительным решением. Это позволяет избежать сложных манипуляций с окном кнопки и сохранить стилизованный внешний вид.

Создано по материалам из источника по ссылке.

Проблема изменения цвета шрифта в TButton с использованием стилей Delphi, особенно при использовании BS_OWNERDRAW и подклассирования.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-23 05:14:36/0.0034620761871338/0