Реагировать в TSpeedButton descandant на изменение стиля - PullRequest
0 голосов
/ 21 марта 2019

Я создал 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...