2017-10-19 23 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 스타일입니다. 델파이 버전은 종종 이러한 질문에 중요합니다. –

답변

3

기본 'Windows'스타일 이외의 Styles을 선택하면 StyleHook -class가 관련 Windows 메시지를 컨트롤에 연결하기 시작합니다. 서로 다른 컨트롤 클래스에 대해 서로 다른 StyleHook 클래스가 있습니다.

TPageControl의 경우는 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 컨트롤을 페인팅해야합니다.

그러나 TTabControlStyleHookprocedure 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; 

.