我使用内置的自定义字形制作了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;