Задача изменения цвета шрифта в 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.