IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

ListBox Scrollbar Couleur


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 57
    Points
    57
    Par défaut ListBox Scrollbar Couleur
    Bonjour,

    J'ai une listbox avec nombre de strings toujours trop important pour la listbox comme pour l ecran.

    Ceci implique pour la listbox l apparition d une scrollbar verticale.

    J'aimerais changer sa couleur. J'ai trouver deux post sur le forum à ce sujet.

    L'un propose l utilisation de sendmessage avec un message special pour le background d une scrollbar. Cependant le topic n est pas resolu, etant donné que l'utilisateur a preferré passer à autre chose. De plus, en ce qui me concerne, j'aimerais modifier toute les couleurs de cette scrollbar.


    Pourriez vous m aider ?

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    J'y ai un peu réfléchi, j'ai pas encore de réponse, à part avec les API windows et l'utilisation de la propriété WindowProc() de de la listbox.

    sinon,
    toute les couleurs de cette scrollbar.
    C'est à dire ? l'ascenceur et le fond, c'est ça ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 57
    Points
    57
    Par défaut
    Bonsoir,

    Par toutes les couleurs j'entend l ascenceur, le fond, et les petites fleches aux extremites de la scrollbar.

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Bon, voici ma réponse après enquète : J'ai pas trouvé...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 57
    Points
    57
    Par défaut
    Hum j'y avais pas pensé...

    Quelqu'un d'autre aurait il une idée ?

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Je crois que personne n'aura d'idée à te proposer étant donné que :
    - J'ai vraiment cherché..
    - Je ne suis pas du genre à lacher l'affaire...

    Mais si tu y tiens vraiment saches que tu as plusieurs solutions, une simple qui ne te conviendras surement pas, et deux vraiment balaises

    Allons-y :

    A savoir : sous Windows, tu as deux types de Scrollbars déjà toutes faites
    - Tu as La "Contrôle-Scrollbar", qui est un objet windows à part entière (comme TMemo, TEdit, etc...) et qui est encapsulé dans les composants déscendants de TScrollingWinControl (TForm, TFrame, et TScrollBox) et accessibles via les propriété HorizontalScrollBar et VerticalScrollbar.
    - Tu as la Scrollbar que j'appelle "système", qui est la Scrollbar des objets Windows et qui sont encapsulé par la VCL sous les classes que tu connais bien TMemo, TListBox, etc...
    L'aspect de ces scrollbars (qui est la même en fait) est géré par Windows. Autant sous Windows9x, tu as une propriété Color et une propriété Style qui est utilisable, autant elle ne sert à rien sous Windows XP...
    Au niveau de l'affichage, tu n'as pas 10000 façons différentes de gérer leur apparence.
    En fait, pour ces deux Scrollbars, tu as trois solutions différentes pour changer leur aspect... deux "simples" (et encore) qui change l'aspect de TOUTES les scrollbar Windows, et une moins simple

    Sinon, tu en as une autre qui apparait comme contrôle à part entière dans la VCL : TScrollBar, ça c'est un contrôle fenétré dérivé de TWinControl, qui, si on intercepte les bon message Windows (CN_CTLCOLORSTATIC en l'occurence, via l'utilisation de la propriété TWinControl.WindowProc), peut au moins voir la couleur de son arrière plan modifiée, même, sous Windows XP.
    On peut même envisager de la redessiner à la volée (en interceptant le message WM_PAINT).

    Revenons, si tu veux bien, à la scrollbar "made in Krosoft" :
    - première solution : tu changes sa couleur en modifiant la couleur système qui lui correspond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Kind: Integer;
      Color: TColor;
    begin
      Kind:=COLOR_SCROLLBAR;
      Color:=clRed;
      SetSysColors(1,Kind,Color);
    end;
    Inconvénients : ça change la couleur de toutes les scrollbars de windows (enfin, que celle des navigateurs sous XP, parce quelle sont créées différemment avec CreateWindowEx, et si tu es en theme "Windows Classique")

    Deuxième solution :
    Sous Windows XP, les scrollbar sont en fait des skins... c'est pour ça que tu ne peux pas changer leurs couleurs.
    si tu cherches bien dans le dossier système de windows, tu tomberas sur les bitmaps utilisées pour les dessiner. Sous 9x, si mes souvenirs sont bon, les scrollbars sont dessinées grace à une Police de caractère particulière (Marlett je crois).
    Donc, sous XP, tu changes les entrées ad'hoc de la base de registre pour que ça pointe vers tes bitmap à toi --> ça change toutes les Scrollbar de windows façon "Crystal XP" ou autres utilitaires pour changer l'apparence de Windows.

    troisième solution, tu redessines par dessus les scrollbars de ton contrôle au moment du WM_Paint, pour ce faire, tu dispose des dimension des bitmaps utilisées par windows XP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetSystemMetrics(<Parametre>);
    avec, je cite en anglais :
    System metric Description
    SM_CXHSCROLL Width of arrow bitmap on horizontal scroll bar
    SM_CXHTHUMB Width of scroll box on horizontal scroll bar. In version 4.0 or later, this value retrieves the width a scroll bar that has a page size of zero.
    SM_CXVSCROLL Width of arrow bitmap on vertical scroll bar
    SM_CYHSCROLL Height of arrow bitmap on horizontal scroll bar
    SM_CYVSCROLL Height of arrow bitmap on vertical scroll bar
    SM_CYVTHUMB Height of scroll box on vertical scroll bar. In version 4.0 or later, this value retrieves the height of a scroll bar that has a page size of zero.
    Cette methode doit surement être simplifiée par l'usage des Skins, tu devrais pouvoir trouver des outils/bibliothèque pour Delphi qui sachent faire ça.
    Je ne dois pas trop m'avancer si je te dis que ces outils de skins utilisent un fichier de resource comme celui utilisé par XPManifest (voir l'unité XPMan si tu l'as dans ton Delphi). A partir de là tu peux peut-être même le faire toi même...


    Quatrième solution (celle que je te recommande) :
    - A l'execution, dans une fiche, tu mets une TListBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TMyScrollbar=class(TScrollBar)
      private
      protected
        procedure CNCtlColorScrollBar(var Message: TMessage); message CN_CTLCOLORSCROLLBAR;
      public
      end;
     
      TForm1 = class(TForm)
        ListBox1: TListBox;
        procedure FormPaint(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
          Rect: TRect; State: TOwnerDrawState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        ScrollV:TMyScrollbar;
        procedure ScrollVOnScroll(Sender: TObject; ScrollCode: TScrollCode;
        var ScrollPos: Integer);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses Types;
     
    {$R *.dfm}
     
    procedure TForm1.FormPaint(Sender: TObject);
    var ScrollInfo:TScrollInfo;
        ScrollRect:TRect;
        VThumbRect,ARect:TRect;
        TotalHeight:integer;
     
    begin
     
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var APoint:TPoint;
    begin
      APoint:=ListBox1.ClientToParent(Point(ListBox1.ClientRect.Right,ListBox1.ClientRect.Top));
      ScrollV:=TMyScrollbar.Create(self);
      ScrollV.Parent:=self;
      ScrollV.Kind:=sbVertical;
      ScrollV.Height:=ListBox1.ClientHeight;
      ScrollV.Left:=ListBox1.Left+ListBox1.Width-ScrollV.Width-1;
      ScrollV.Top:=ListBox1.Top+2;
      ScrollV.OnScroll:=ScrollVOnScroll;
      ScrollV.Brush.Color:=clred;
    end;
     
    procedure TForm1.ScrollVOnScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    var ScrollInfo:TScrollInfo;
        ACanvas:TControlCanvas;
    begin
      scrollinfo.fMask:=SIF_ALL;
      ScrollInfo.cbSize:=sizeof(ScrollInfo);
      GetScrollInfo(ListBox1.Handle,SB_VERT,scrollinfo);
      ScrollV.PageSize:=ScrollInfo.nPage;
      ScrollV.Min:=ScrollInfo.nMin;
      ScrollV.Max:=ScrollInfo.nMax;
      ScrollInfo.fMask:=SIF_POS;
      ScrollInfo.nPos:=ScrollPos;
      SendMessage(ListBox1.Handle,WM_VSCROLL,SB_THUMBPOSITION+(ScrollPos shl 16),0);
    end;
     
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var ScrollInfo:TScrollInfo;
    begin
      scrollinfo.fMask:=SIF_ALL;
      ScrollInfo.cbSize:=sizeof(ScrollInfo);
      GetScrollInfo(ListBox1.Handle,SB_VERT,scrollinfo);
      ScrollV.Min:=ScrollInfo.nMin;
      ScrollV.Max:=ScrollInfo.nMax;
      ScrollV.PageSize:=ScrollInfo.nPage;
    end;
    { TMyScrollbar }
     
    procedure TMyScrollbar.CNCtlColorScrollBar(var Message: TMessage);
    var ABrush:TBrush;
    begin
      ABrush:=TBrush.Create;
      ABrush.Color:=clRed;
      Message.Result:=ABrush.Handle;
      with Message do
        CallWindowProc(DefWndProc, Handle, Msg, WParam, LParam);
    end;
     
    end.
    Tu vois que l'on crée ici un descendant de TSCrollBar,dont le fond sera colorié en rouge.

    On a tout simplement placé notre Scrollbar au dessus de la vraie scrollbar du TListControl.
    Le tout à été de synchroniser le Scrolling de la ListBox, avec celui de notre TMyScrollBar.

    Imagine que notre TMyScrollBar soit entièrement dessinée à la main (un peu comme à travers le dessin d'une TPaintBox), là tu peut te dire que tu va pouvoir modifier toutes les couleurs de ta ScrollBar.
    He bien à la place de notre TMyScrollBar, tu peux utiliser des composants gratuits comme ALScrollBar.

    Tu peux le télécharger ici :
    http://www.torry.net/pages.php?id=160

    voilà, voilà... après je ne peut plus rien faire pour toi

    Bon dev

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 57
    Points
    57
    Par défaut
    Merci pour ces résultats concis et précis !

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 449
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 449
    Points : 1 335
    Points
    1 335
    Par défaut ListBox Scrollbar Couleur
    Bonjour,

    Bravo pour la dernière solution fallait y penser ! et qui fonctionne avec le Scrollbar vertical.

    Dans le cas du Scrollbar Horizontal, que faudrait t'il changer dans le code pour que cela fonctionne aussi bien par exemple, pour un Ttreeview.

    Merci,

    @+,

    Cincap

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Dans le sens de la verticale, et pour un treeview, ça donnerais ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;
     
    type
      TMyScrollbar=class(TScrollBar)
      private
      protected
        procedure CNCtlColorScrollBar(var Message: TMessage); message CN_CTLCOLORSCROLLBAR;
      public
      end;
     
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        procedure FormPaint(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
          Rect: TRect; State: TOwnerDrawState);
        procedure TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
          Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
          var PaintImages, DefaultDraw: Boolean);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        ScrollH:TMyScrollbar;
        procedure ScrollHOnScroll(Sender: TObject; ScrollCode: TScrollCode;
        var ScrollPos: Integer);
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses Types;
     
    {$R *.dfm}
     
    procedure TForm1.FormPaint(Sender: TObject);
    var ScrollInfo:TScrollInfo;
        ScrollRect:TRect;
        VThumbRect,ARect:TRect;
        TotalHeight:integer;
     
    begin
     
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var APoint:TPoint;
    begin
      APoint:=TreeView1.ClientToParent(Point(TreeView1.ClientRect.Left,TreeView1.ClientRect.bottom));
      ScrollH:=TMyScrollbar.Create(self);
      ScrollH.Parent:=self;
      ScrollH.Kind:=sbHorizontal;
      ScrollH.Width:=TreeView1.ClientWidth;
      ScrollH.Left:=TreeView1.Left+2;
      ScrollH.Top:=TreeView1.Top+TreeView1.Height-ScrollH.Height-1;
      ScrollH.OnScroll:=ScrollHOnScroll;
      ScrollH.Brush.Color:=clred;
    end;
     
    procedure TForm1.ScrollHOnScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    var ScrollInfo:TScrollInfo;
        ACanvas:TControlCanvas;
    begin
      scrollinfo.fMask:=SIF_ALL;
      ScrollInfo.cbSize:=sizeof(ScrollInfo);
      GetScrollInfo(TreeView1.Handle,SB_HORZ,scrollinfo);
      ScrollH.PageSize:=ScrollInfo.nPage;
      ScrollH.Min:=ScrollInfo.nMin;
      ScrollH.Max:=ScrollInfo.nMax;
      ScrollInfo.fMask:=SIF_POS;
      ScrollInfo.nPos:=ScrollPos;
      SendMessage(TreeView1.Handle,WM_HSCROLL,SB_THUMBPOSITION+(ScrollPos shl 16),0);
    end;
     
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var ScrollInfo:TScrollInfo;
    begin
     
    end;
    { TMyScrollbar }
     
    procedure TMyScrollbar.CNCtlColorScrollBar(var Message: TMessage);
    var ABrush:TBrush;
    begin
      ABrush:=TBrush.Create;
      ABrush.Color:=clRed;
      Message.Result:=ABrush.Handle;
      with Message do
        CallWindowProc(DefWndProc, Handle, Msg, WParam, LParam);
    end;
     
    procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
      var PaintImages, DefaultDraw: Boolean);
    var ScrollInfo:TScrollInfo;
    begin
      scrollinfo.fMask:=SIF_ALL;
      ScrollInfo.cbSize:=sizeof(ScrollInfo);
      GetScrollInfo(TreeView1.Handle,SB_HORZ,scrollinfo);
      ScrollH.Min:=ScrollInfo.nMin;
      ScrollH.Max:=ScrollInfo.nMax;
      ScrollH.PageSize:=ScrollInfo.nPage;
    end;
     
    end.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 449
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 449
    Points : 1 335
    Points
    1 335
    Par défaut ListBox Scrollbar Couleur
    Bonjour,

    Réponse rapide et fonctionnelle.

    Chapeau bas Cher Monsieur.

    Pensez-vous qu'il est possible de combiner ce code pour les deux scrollbar (H et V) dans le cas d'une utilisation d'un Ttreeview.

    Merci de votre attention,

    Cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dans une ListBox, une couleur par ligne
    Par molo2003 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 13/02/2010, 12h17
  2. Scrollbar couleur et W3C
    Par Rakken dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 07/07/2009, 09h32
  3. ListBox et couleurs
    Par mohamed dans le forum Delphi
    Réponses: 4
    Dernier message: 12/09/2006, 17h05
  4. [Scrollbar] Couleur
    Par Vrylx dans le forum Composants
    Réponses: 4
    Dernier message: 26/07/2005, 16h40
  5. [Listbox] ScrollBar Horizontal
    Par haleem dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2005, 07h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo