2017-10-19 26 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スタイルで三角形を描くのですか?

デルファイ10シアトル。

+0

テーマではなくVCLスタイルです。そして、Delphiのバージョンは、しばしば、そのような質問のために重要です。 –

答えて

3

ネイティブの「Windows」スタイル以外のStylesが選択されている場合、StyleHook -classは、関連するWindowsメッセージをコントロールにフックし始めます。コントロールクラスごとに異なるStyleHookクラスがあります。

TPageControlの場合はTTabControlStyleHookです。フッククラスコンビネーションは、クラスコンストラクタTCustomStyleEngine.RegisterStyleHook(TCustomTabControl, TTabControlStyleHook);に登録されています(TCustomTabControl)。このフッククラスは、スタイルが有効になっているときにTCustomTabControl自身をペイントするため、コントロールペイントをオーバーライドしています。

何行うことができますが、デフォルトTStyleHookClassの登録を解除し、開発者のペイントをできるようになるものを登録している:

TMyTabControlStyleHookは以下の通りです
TCustomStyleEngine.UnRegisterStyleHook(TCustomTabControl, TTabControlStyleHook); 
    TCustomStyleEngine.RegisterStyleHook(TCustomTabControl, 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;がありますが、これは無効にすることができます。

DrawTabOverrideはスタイリング時にネイティブとStyleHookクラスで DrawTabを描画するときに、それは OnDrawTabイベントで呼び出すことができ、この

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

のようなものである

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; 

関連する問題