Couleur d'un TPageControl / Tabsheet

cs_Lisla Messages postés 11 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 12 avril 2007 - 12 avril 2007 à 11:46
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 12 avril 2007 à 13:28
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

jelume Messages postés 120 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 15 novembre 2007 1
12 avril 2007 à 13:15
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;
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
12 avril 2007 à 13:24
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.
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
12 avril 2007 à 13:28
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.
0
Rejoignez-nous