Est-il possible de changer la couleur des onglets TTabSheet
Question
Je courais Lazare 0.9.30.2. J'ai un TForm sur lequel il y a un TPageControl. Au sein de la TPageControl il y a une série de TTabSheets (environ 30 d'entre eux). Ce que je veux faire est un code couleur les onglets, de sorte que les 10 premiers sont rouges, à côté 10 sont bleus et les 10 derniers sont verts. J'ai vu des extraits de code sur l'intranet qui changent la couleur de la feuille de tabulation (y compris l'onglet lui-même) lorsque vous cliquez dessus et navigate les (pour sélectionner l'onglet actif), mais ce que je veux faire est de les couleurs comme décrit ci-dessus lorsque les feuilles à onglets sont d'abord chargés.
Est il y a moyen de le faire?
La solution
If it's enough for you to get a little bit tricky solution working only on Windows with themes disabled then try the following:
Un-check the Use manifest file to enable themes (Windows only)
option from Project / Project Options ...
project settings dialog and paste the following code into your unit with page control. It uses the interposed class, so it will work only in units where you paste this code.
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;
Here is how it looks like (ugly :)