Changer les couleurs des barres de défilement

cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011 - 25 mai 2007 à 20:22
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 - 29 mai 2007 à 22:30
Bonjours tout le monde
Dites, je suis en train de mettre en place la gestion des skin pour mon lecteur audio DéKiBulle (http://dekibulle.free.fr)
et il me reste un truc qui marche pas : c'est la couleur des barres de défilement que je ne sais pas comment changer
Voici ce que ça donne avec un skin "black" c'est pas super :

Est-ce que quelqu'un saurais comment faire ?

Merci d'avance
a+
fred

8 réponses

sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
26 mai 2007 à 11:08
Bonjour !

Une méthode par API :
http://discuss.fogcreek.com/joelonsoftware2/default.asp?cmd=show&ixPost=56683&ixReplies=15

Un composant :
http://www.torry.net/pages.php?id=160

A tester !

Cordialement !

SISI231
0
cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011
26 mai 2007 à 11:46
Merci pour ta réponse !

J'ai un peu de mal à comprendre comment mettre en place la méthode par API,
j'ai essayé ça mais ça ne marche pas :

Dans public je déclare :

procedure DefaultHandler(var msg); override;

Puis :

procedure TForm1.DefaultHandler(var msg);
var
    ScrollBrush : HBrush;
begin
    inherited DefaultHandler(Msg);
    if TMessage(msg).Msg = WM_CTLCOLORSCROLLBAR then begin
       ScrollBrush := CreateSolidBrush($FFFFFF);
       TMessage(msg).Result := ScrollBrush;
    end;
end;

Pourriez-vous m'aider encore?

a+
fred
0
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
26 mai 2007 à 12:21
Voici la procédure complète :

Ajoutez pour essayer un TSCrollBar à votre fiche.

Entre private et public ajouter :

 private
    { Déclarations privées }
 procedure colorise_scrollbars(var Msg: Tmessage);
  public

Ensuite, déclarez :

var
  Form1: TForm1;
  wp:twndmethod;
  hb:hbrush;

Ensuite voici l'implémentation :

implementation


{$R *.dfm}
procedure TForm1.colorise_scrollbars(var Msg: tmessage);
begin
if msg.msg = WM_CTLCOLORSCROLLBAR then
msg.Result:= hb
else
wp(msg);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
wp:=form1.WindowProc;
form1.WindowProc:= colorise_scrollbars;
hB := CreateSolidBrush(RGB(255,0,0));
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(hB);
end;
SISI231
0
cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011
27 mai 2007 à 22:00
Merci encore pour ta réponse !

Ta solution marche bien pour les composant TScrollBar mais cela semble ne pas marcher pour les scrollbar des composants Tlistbox et Ttreeview ?
Est-ce que ça signifie que si je veux arriver à personnaliser les couleurs de ces scrollbar il va falloir que je gère moi-même le scroll avec des composants "a côtés" style TScrollBar ?

je suis désolé si je suis un peu casse burne avec mes questions

a+
fred
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 mai 2007 à 23:42
Salut,

Je n'ai pas la solution miracle, je crois qu'il va te falloir passer par un composant qui gère ça.
Sinon, en attendant, essaye pour voir de mettre la propriété Ctl3D de tes ListBox à False.
Je trouve que ça rend le look un peu plus acceptable, du moins sous XP...

Bonne continuation pour ton dekibulle.
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
28 mai 2007 à 11:09
Bonjour à tous,

@ Flagada, voici un exemple (D6) avec synchronisation qui permet de changer la couleur du fond du scrollbar d'un Tlisbox, Ttreeview en modifiant le code naturellement pour le composant choisi.



unit testColScroll;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;


type
  TMonScrollbar=class(TScrollBar)
  private
  protected
    procedure CNCtlColorScrollBar(var Message: TMessage); message CN_CTLCOLORSCROLLBAR;
  public
  end;


  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);


  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    ScrollV:TMonScrollbar;
    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:=TMonScrollbar.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;
{ TMonScrollbar }


procedure TMonScrollbar.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.


@+,

Cincap

[url]mailto:/url
0
cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011
29 mai 2007 à 21:26
quelle galère merci beaucoup pour vos reponses 
j'espérais trouver une solution simple mais a priori ça n'est pas si facile

la solution de cincap pourrait peut-etre convenir mais ça fait beaucoup de code juste pour une couleur et encore il y a des problèmes :
la scrollbar reste affichée même s'il n'y en a pas besoin (par exemple si la liste contient peu d'items), je vais voir si je vais m'en servir mais ça va énormément compliquer mon prog qui l'est déjà pas mal
j'ai bien peur de devoir laisser tomber l'idée... ou bien il faut que je programme des listbox et des treeview perso

merci encore
a+
fred
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
29 mai 2007 à 22:30
Bonsoir à tous,

@ Flagada, normal puisque c'est un scrollbar qui est repaint sur celui du Ttreeview ou autres.


Sur XP, le scrollbar est un skin et ne peut être repaint en utilisant la propriété "color".

La solution la plus simple c'est d'utiliser une Vcl Skins pour ton lecteur.

Ex: http://www.alphaskins.com/index.php

@+,

Cincap
[url]mailto:/url
0