如何在VCL样式的页面控件上绘制所有者

时间:2017-10-19 07:53:00

标签: delphi canvas delphi-10-seattle ownerdrawn tpagecontrol

当我有这个:

if not _nightMode then
  TStyleManager.TrySetStyle('Windows', False);

我可以在页面控制上绘制所有者:

procedure TMyMainForm.pcDetailedDrawTab(Control: TCustomTabControl; TabIndex: Integer;
    const Rect: TRect; Active: Boolean);
var
  can: TCanvas;
  cx, by: Integer;
  aclr: TColor;
begin
  if pcDetailed.Pages[TabIndex] = tsActualData then begin
    can := pcDetailed.Canvas;
    cx := Rect.Left + Rect.Width div 2;
    by := Rect.Bottom - 2;
    if _nightMode then aclr := clWhite else aclr := clBlack;
    can.Pen.Color := aclr;
    can.Brush.Color := aclr;
    can.Polygon([Point(cx - 10, by - 10), Point(cx + 10, by - 10), Point(cx, by)]);
  end;
end;

当我有这个:

if _nightMode then
  TStyleManager.TrySetStyle('Cobalt XEMedia', False);

我画的三角形丢失了。

如何使用任何VCL样式绘制三角形?

Delphi 10 Seattle。

1 个答案:

答案 0 :(得分:3)

当选择本地' Windows'风格之外的Styles时,StyleHook - 类将开始将相关的窗口消息绘制到控件上。不同的控件类有不同的StyleHook类。

如果TPageControlTTabControlStyleHook。 hook-class-combination在TCustomStyleEngine.RegisterStyleHook(TCustomTabControl, TTabControlStyleHook);的类构造函数中注册了TCustomTabControl。此挂钩类覆盖控件绘制,因为它将在启用样式时绘制TCustomTabControl本身。

可以做的是取消注册默认的TStyleHookClass并注册一个让开发人员画画:

  TCustomStyleEngine.UnRegisterStyleHook(TCustomTabControl, TTabControlStyleHook);
  TCustomStyleEngine.RegisterStyleHook(TCustomTabControl, TMyTabControlStyleHook);

以下TMyTabControlStyleHook

type
  TMyTabControlStyleHook = class(TTabControlStyleHook)
  public
    constructor Create(AControl: TWinControl); override;
  end;

constructor TMyTabControlStyleHook.Create(AControl: TWinControl);
begin
  inherited Create(AControl);
  OverridePaint := False;
end;

然而,这并不等同于仅绘制TPageControl中的标签,因为TTabControlStyleHook负责绘制完整的TPageControl控件。

但是TTabControlStyleHookprocedure DrawTab(Canvas: TCanvas; Index: Integer); virtual;可以覆盖它。

type
  TMyTabControlStyleHook = class(TTabControlStyleHook)
  strict protected
    procedure DrawTab(Canvas: TCanvas; Index: Integer); override;
  end;

procedure TMyTabControlStyleHook.DrawTab(Canvas: TCanvas; Index: Integer);
begin
  DrawTabOverride(Canvas, Index, TabRect[Index], TCustomTabControl(Control).MouseInClient);
end;

DrawTabOverride就是这样的

procedure DrawTabOverride(Canvas: TCanvas;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);

因此,在设置样式时,可以在OnDrawTab事件中调用本机时在StyleHook类DrawTab中调用它。