2012-02-18 2 views
4

저는 Lazarus 0.9.30.2를 사용하고 있습니다.TPageControl있는 TForm 있습니다. TPageControl에는 일련의 TTabSheets (약 30 개)이 있습니다. 내가 원하는 것은 색상 코드 탭입니다. 그래서 처음 10 개는 빨간색이고, 다음 10 개는 파란색이고 마지막 10 개는 녹색입니다. 인트라넷에서 탭 시트 색상 (탭 자체 포함)을 변경하고 해당 탭을 클릭하여 (활성 탭을 강조 표시하기 위해) 탐색하는 코드 스 니펫을 보았습니다. 그러나 위에서 설명한대로 색상을 지정하고 싶습니다. 탭 시트가 먼저로드됩니다.TTabSheet 탭의 색을 바꿀 수 있습니까

이렇게하는 방법이 있습니까?

enter image description here

+2

처럼 안녕을 보이는 방법이다. 대신에'TTabControl'을 사용하려고 했습니까? 필요한 OnDrawTab 이벤트가 게시되었습니다. 나사로는 델파이의 다른 'TPageControl' 조상으로부터 왔습니다. – TLama

+0

나는 이와 같은 것을하고 싶다. [예제] http://imgur.com/cNMko – user1174918

+0

이것은 정말로 훌륭하다. @TLama ..... 내가하고 싶은 일은 괜찮아. 매우 감사. – user1174918

답변

4

당신이 테마를 윈도우에서만 작동 다음 시도하지 않도록 조금 까다로운 솔루션을 얻을하는 것이 충분하면 다음

Project/Project Options ... 프로젝트에서 Use manifest file to enable themes (Windows only) 옵션을 취소합니다 설정 대화 상자에서 다음 코드를 페이지 컨트롤을 사용하여 유닛에 붙여 넣으십시오. 삽입 된 클래스를 사용하므로이 코드를 붙여 넣은 단위에서만 작동합니다. 여기

uses 
    ComCtrls, Windows, LCLType; 

type 
    TPageControl = class(ComCtrls.TPageControl) 
    private 
    procedure CNDrawItem(var Message: TWMDrawItem); message WM_DRAWITEM; 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

implementation 

procedure TPageControl.CreateParams(var Params: TCreateParams); 
begin 
    inherited CreateParams(Params); 
    with Params do 
    begin 
    if not (csDesigning in ComponentState) then 
     Style := Style or TCS_OWNERDRAWFIXED; 
    end; 
end; 

procedure TPageControl.CNDrawItem(var Message: TWMDrawItem); 
var 
    BrushHandle: HBRUSH; 
    BrushColor: COLORREF; 
begin 
    with Message.DrawItemStruct^ do 
    begin 
    case itemID of 
     0: BrushColor := RGB(235, 24, 33); 
     1: BrushColor := RGB(247, 200, 34); 
     2: BrushColor := RGB(178, 229, 26); 
    else 
     BrushColor := ColorToRGB(clBtnFace); 
    end; 
    BrushHandle := CreateSolidBrush(BrushColor); 
    FillRect(hDC, rcItem, BrushHandle); 
    SetBkMode(hDC, TRANSPARENT); 
    DrawTextEx(hDC, PChar(Page[itemID].Caption), -1, rcItem, DT_CENTER or 
     DT_VCENTER or DT_SINGLELINE, nil); 
    end; 
    Message.Result := 1; 
end; 

는 내가 질문을받을 모르겠지만, 거기 (추한 :

enter image description here

관련 문제