2017-10-19 25 views
1

Quand j'ai ceci:Comment owner-draw sur la page style VCL contrôle

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

je peux owner-draw sur la page de contrôle:

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; 

Quand j'ai ceci:

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

mon triangle dessiné est perdu. Comment dessiner un triangle avec n'importe quel style VCL?

Delphi 10 Seattle.

+0

Ce sont des styles VCL plutôt que des thèmes. Et la version de Delphi compte souvent pour de telles questions. –

Répondre

3

Lorsque Styles autre que le style natif «Windows» sont choisis, une classe StyleHook commencera à accrocher les messages Windows pertinents pour la peinture aux contrôles. Il existe différentes classes StyleHook pour différentes classes de contrôle.

Dans le cas du TPageControl, il s'agit du TTabControlStyleHook. La combinaison hook-class est enregistrée avec TCustomStyleEngine.RegisterStyleHook(TCustomTabControl, TTabControlStyleHook); dans le constructeur de classe de TCustomTabControl. Cette classe de crochet est en train de surcharger la peinture des contrôles, car elle peindra le TCustomTabControl lui-même lorsqu'un style est activé.

Qu'est-ce qui peut être fait est désinscription par défaut TStyleHookClass et enregistrer un qui permettra la peinture de développeur:

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

TMyTabControlStyleHook est le suivant:

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

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

Ce n'est cependant pas l'équivalent exact peindre uniquement les onglets dans le TPageControl, car le TTabControlStyleHook est chargé de peindre le contrôle complet TPageControl.

Mais TTabControlStyleHook a le procedure DrawTab(Canvas: TCanvas; Index: Integer); virtual; qui peut être surchargée pour cela.

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 est quelque chose comme ça

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

il peut être appelé en cas OnDrawTab lors de l'établissement d'origine et dans la classe StyleHook DrawTab quand style.