Couleur d'un TPageControl / Tabsheet

Signaler
Messages postés
11
Date d'inscription
dimanche 11 janvier 2004
Statut
Membre
Dernière intervention
12 avril 2007
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
Bonjour,

J'aimerais savoir comment faire pour changer la couleur d'un TPageControl et de ses TabSheets. Je n'ai rien compris aux messages qui en parlaient vaguement..

Je souhaite juste que la couleur de fond soit la même pour tout le monde, unie. Bref, j'en demande pas trop...
Ah et je suis sous Delphi 3 (ce qui doit pas aider, je suppose)

Je peux me permettre de changer le fond de ma form. Donc j'ai essayé de changer sa couleur, pour que le PageControl en hérite, mais c'est vraiment moche. Y'a les onglets qui restent en gris, et la zone située à leur droite prend aussi la couleur (bon, ça je me doute qu'il faudra faire avec..)

Quelqu'un a t'il une idée ou un bout de code qui puisse m'aider ?
Merci d'avance

3 réponses

Messages postés
120
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
15 novembre 2007
1
Bjr

voilà un bour de code que l'on   m'avait transmis pour regler le problème.
(Merci à Bruno Van de Velde)

type
  TTabSheet = class(ComCtrls.TTabSheet)
  private
    FColor: TColor;
    procedure SetColor(Value: TColor);
    procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
      message WM_ERASEBKGND;
  public
    constructor Create(aOwner: TComponent); override;
    property Color: TColor read FColor write SetColor;
  end;

constructor TTabSheet.Create(aOwner: TComponent);
begin
  inherited;
  FColor := clBtnFace;
end;

procedure TTabSheet.SetColor(Value: TColor);
begin
  if FColor <> Value then
  begin
    FColor := Value;
    Invalidate;
  end;
end;

procedure TTabSheet.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
  if FColor = clBtnFace then
    inherited
  else
  begin
    Brush.Color := FColor;
    Windows.FillRect(Msg.dc, ClientRect, Brush.Handle);
    Msg.Result := 1;
  end;
end;

Puis dans la TForm conteant le PageControl:

procedure TFormXXXX.Create(Sender: object);
begin
  PageControl1.OwnerDraw := True;
  Tabsheet1.Color := clWhite;
  TabSheet2.Color := clLime;
end;

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  AText: string;
  APoint: TPoint;
begin
  with (Control as TPageControl).Canvas do
  begin
    Brush.Color := ClGreen;
    FillRect(Rect);
    AText := TPageControl(Control).Pages[TabIndex].Caption;
    with Control.Canvas do
    begin
      APoint.x := (Rect.Right - Rect.Left) div 2 - TextWidth(AText) div 2;
      APoint.y := (Rect.Bottom - Rect.Top) div 2 - TextHeight(AText) div 2;
      TextRect(Rect, Rect.Left + APoint.x, Rect.Top + APoint.y, AText);
    end;
  end;
end;
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

sans avoir fait de test, tu doit pouvoir t'en sortir avec le OnDrawTab et ownerDraw := false; reagrde aussi le PC.style. Si tu met tsButton c'est moins moche.

mais il te faudra les redessiner complettement à la main. :-\

Une astuce pour garder le fond de ta form: met ton PageControl (align=alCLient) sur un TPanel. et change la couleur de ton Panel.

Il y a peut-être un solution plus simple, mais là je ne la voit pas.

une version (gratuit) plus récente de Delphi:
http://delphi.developpez.com<wbr>/freewares/borland/</wbr>

bonne chance,

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
bon, bin t'as une réponse toute faite...
(problème de refresh....grrr)

A+
Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.