在样式更改时在TSpeedButton取消扫描中做出反应

时间:2019-03-21 13:11:46

标签: delphi graphics controls

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

0 个答案:

没有答案