Я создал TSpeedButton
дескандант со встроенными пользовательскими глифами, которые нарисованы внутри, а не взяты из готового ресурса.
Процедура рисования глифов вызывается в конструкторе, но когда стили переключаются во время выполнения с помощью TStyleManager.TrySetStyle
, глифы должны перерисовываться с использованием цветов, взятых из стиля.
Обычно в TCustomControl
потомке есть метод CreateWnd
, но TSpeedButton
не является TCustomControl
потомком.
Я пытался заменить функциональность этого метода на
procedure CMRecreateWnd(var msg: TMessage); message CM_RECREATEWND;
procedure TMyButton.CMRecreateWnd(var msg: TMessage);
begin
_drawGlyphs();
end;
но это не имеет никакого эффекта. Эта процедура не запускается.
procedure TMyButton._drawGlyphs();
begin
// ......
// Paint glyphs on _bmp
// ......
inherited Layout := TButtonLayout.blGlyphTop;
inherited Glyph := _bmp;
inherited NumGlyphs := 4;
end;
constructor TMyButton.Create(AOwner: TComponent);
begin
inherited;
_bmp := Vcl.Graphics.TBitmap.Create();
_drawGlyphs();
end;
В настоящее время я решил задачу с помощью метода Paint
и переменной для предыдущего цвета:
TMyButton = class(TSpeedButton)
private
_disColor: TColor;
end;
procedure TMyButton.Paint();
begin
inherited;
if _disColor <> _getThemedColor(ttbButtonDisabled, ecTextColor) then begin
_disColor := _getThemedColor(ttbButtonDisabled, ecTextColor);
_drawGlyphs();
end;
end;
function TMyButton._getThemedColor(detail: TThemedToolBar; elementColor: TElementColor): TColor;
var
Details: TThemedElementDetails;
begin
Details := StyleServices.GetElementDetails(detail);
StyleServices.GetElementColor(Details, elementColor, Result);
end;