2017-10-19 111 views
1

当我有这样的:如何在VCL风格的页面控制所有者绘制

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西雅图。

+0

这是VCL的风格,而不是主题。 Delphi的版本通常对这些问题很重要。 –

回答

3

当选择除本机'Windows'风格以外的其他Styles类时,StyleHook类将开始将相关窗口消息绘制到控件。对于不同的控制类,有不同的StyleHook类。

TPageControl的情况下,它是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时被调用。