如何在VCL风格的页面控制所有者绘制
问题描述:
当我有这样的:如何在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西雅图。
答
当选择除本机'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
控件。
但是TTabControlStyleHook
的procedure 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
时被调用。
这是VCL的风格,而不是主题。 Delphi的版本通常对这些问题很重要。 –