Pregunta

Estoy ejecutando Lázaro 0.9.30.2. Tengo una formación en la que hay un tpageControl. Dentro del tpageControl hay una serie de hojas de ttab (alrededor de 30 de ellas). Lo que quiero hacer es código de color las pestañas, por lo que los primeros 10 son rojos, los próximos 10 son azules y los últimos 10 son verdes. He visto fragmentos de código en la intranet que cambian el color de la hoja de pestaña (incluida la pestaña en sí) cuando hace clic en ellos y navega hacia ellos (para resaltar la pestaña activa), pero lo que quiero hacer es colorearlos como se describe anteriormente cuando Las hojas de pestaña se cargan primero.

¿Hay forma de hacer esto?

enter image description here

¿Fue útil?

Solución

Si es suficiente para que obtengas una solución un poco difícil Trabajar solo en Windows con temas discapacitados Luego intente lo siguiente:

No verifique el Use manifest file to enable themes (Windows only) opción de Project / Project Options ... Diálogo de configuración del proyecto y pegue el siguiente código en su unidad con el control de la página. Utiliza la clase interpuesta, por lo que funcionará solo en unidades donde pegas este código.

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;

Así es como se ve (feo :)

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top