当我有这个:
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。
答案 0 :(得分:3)
当选择本地' Windows'风格之外的Styles
时,StyleHook
- 类将开始将相关的窗口消息绘制到控件上。不同的控件类有不同的StyleHook
类。
如果TPageControl
是TTabControlStyleHook
。 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
控件。
但是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
中调用它。