2012-02-18 95 views
4

我正在運行Lazarus 0.9.30.2。 我有一個TPorm,其上有一個TPageControl。在TPageControl中有一系列TTabSheets(其中約30個)。我想要做的是對選項卡進行顏色編碼,所以前10個是紅色,後10個是藍色,最後10個是綠色。我已經看到內部網上的代碼片段,當你點擊它們並導航到它們(突出顯示活動選項卡)時,它會更改選項卡的顏色(包括選項卡本身),但是我想要按照上面所述爲它們着色時標籤頁首先被加載。是否可以改變TTabSheet標籤的顏色

有沒有辦法做到這一點?

enter image description here

+2

您好,我不知道我明白你的問題。您是否嘗試過使用'TTabControl'?它發佈了所需的「OnDrawTab」事件。拉撒路從德爾福有不同的'TPageControl'祖先。 – TLama 2012-02-20 14:03:14

+0

我想做這樣的事情[例子] http://imgur.com/cNMko – user1174918 2012-02-21 09:46:41

+0

這真的很棒@TLama .....對我想做的事情沒問題。非常感激。 – user1174918 2012-02-22 08:43:16

回答

4

如果它足夠讓你獲得一個有點棘手的解決方案與主題只能在Windows上工作禁用然後嘗試以下方法:

取消選中從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