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?

enter image description here

È stato utile?

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 :)

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top