È possibile modificare il colore delle schede Ttabsheet
Domanda
Sto eseguendo Lazzaro 0.9.30.2. Ho un TFORM su cui esiste un TPageControl. All'interno del tpageControl c'è una serie di fogli di ttab (circa 30 di essi). Quello che voglio fare è il codice colore le schede, quindi i primi 10 sono rossi, i prossimi 10 sono blu e gli ultimi 10 sono verdi. Ho visto frammenti di codice sull'intranet che cambiano il colore della scheda (inclusa la scheda stessa) quando si fa clic su di essi e navighi verso di loro (per evidenziare la scheda attiva), ma quello che voglio fare è colorarli sopra quando I fogli di scheda vengono carichi per la prima volta.
C'è modo di farlo?
Soluzione
Se ti basta avere una soluzione un po 'complicata Lavorando solo su Windows con temi disabilitati Quindi prova quanto segue:
Non ricontrollare il Use manifest file to enable themes (Windows only)
Opzione da Project / Project Options ...
Finestra di dialogo Impostazioni del progetto e incolla il seguente codice nella tua unità con il controllo della pagina. Utilizza la classe interposta, quindi funzionerà solo in unità in cui incolla questo codice.
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;
Ecco come appare (brutto :)