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 :

changer la couleur d'un bouton


Sujet :

Delphi

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut changer la couleur d'un bouton
    Salut,

    J'essaie tout simplement de changer la couleur d'un bouton.

    C'est bien l'un des rares composants qui ne possède pas d'option color ...

    Est-ce que quelqu'un sait comment changer la couleur d'un bouton ? avec Delphi 2006 sous WinXP

    D'avance merci pour vos réponses

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut ButtonWithColor
    Bonjour.

    Cherche sur le Web l'unite "ButtonWithColor". c'est un composant bouton qui permet de choisir la couleur du bouton et d'y ajouter une image comme le BitButton.

    Le composant que j'avais trouvé il y a plusieurs années plantait sous XP. Je l'ai corrigé à ma façon. Si le problème perciste dans la version que tu trouvera, je t'enverais le composant.

    A+
    Rien n'est moins sur que l'incertain : Pierre DAC

  3. #3
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci Philippe Gormand pour ta proposition, mais n'y a t'il pas moyen de forcer la couleur que l'on souhaite ?

    Comme on l'a montré dans la FAQ pour un TProgressBar : http://delphi.developpez.com/faq/?pa...ouleurprogress.

    J'ai bien essayé plusieurs possibilités mais rien n'y fait ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button6.Brush.Color := $000080;

  4. #4
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Hélas !

    J'ai longtemps cherché, je n'ai jamais trouvé. Ce qui ne veut pas dire que ce ne soit pas possible.

    En tout cas, je ne sait pas. Désolé. Mais, ButtonWithColor le remplace tout à fait.

    Rien n'est moins sur que l'incertain : Pierre DAC

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Le message pour changer la couleur d'un bouton est celui décrit ici :
    http://msdn.microsoft.com/library/de...tlcolorbtn.asp

    Cependant, il y a de fortes chances que ça ne fonctionne pas, le bouton se dessinant seul sous Delphi. Il faut dériver un composant pour arriver au résultat escompté...

    @++

    PS: As-tu regardé dans la JVCL s'il n'y avait pas un composant tout prêt ?
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  6. #6
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par Eric Sigoillot
    Bonjour,

    Le message pour changer la couleur d'un bouton est celui décrit ici :
    http://msdn.microsoft.com/library/de...tlcolorbtn.asp

    Cependant, il y a de fortes chances que ça ne fonctionne pas, le bouton se dessinant seul sous Delphi. Il faut dériver un composant pour arriver au résultat escompté...

    @++
    J'ai essayé ce code, mais sans succès ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Const
      WM_CTLCOLORBTN = WM_USER + 9;
      //Envoi du message avec la couleur voulue
      SendMessage(Button6.Handle,WM_CTLCOLORBTN,0,clLime);
    Citation Envoyé par Eric Sigoillot
    PS: As-tu regardé dans la JVCL s'il n'y avait pas un composant tout prêt ?
    Je vais regarder directement.

  7. #7
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Il y a quelques composants en JVCL qui se rapprochent du Button, mais il n'y a pas de JvButton ... du moins je ne l'ai pas trouvé.

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    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
    Vas vite voir tout ça (c'est un descendant de TButton) :
    Page de l'auteur : http://www.latiumsoftware.com/en/delphi/00043.php

    Download : http://delphi.developpez.com/sources/zip/colorBtn.zip



    Sinon,pour info, je suis en train de me pencher sur la question pour un TButton Delphi Standard.
    Le truc qui me bloque pour l'instant, c'est l'interception de l'appel à CreateWindowEx,utilisé par la méthode CreateWnd de a classe parente TButtonControl, grace au message windows WM_NCCREATE.
    Bidouilleuse Delphi

  9. #9
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Si l'on s'en tient à MSDN, tu ne pourras pas changer la couleur du bouton à moins de le dessiner toi même.

    Sinon, la définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WM_CTLCOLORBTN = WM_USER + 9;
    est complètement farfelue !
    Le bouton ne va pas deviner tout seul que c'est cette valeur qu'il faut utiliser.

    Regarde dans les fichiers headers C du SDK Windows pour connaître la valeur correcte de WM_CTLCOLORBTN (je ne les ai pas sous la main pour le moment).

    [EDIT]D'ailleurs, tu ne devrais pas avoir à définir cette valeur. Le message doit être déjà défini dans l'unité Messages.
    A défaut, j'ai trouvé ça :@++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  10. #10
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut ????????????
    Eric Sigoillot a écrit :
    Le message pour changer la couleur d'un bouton est celui décrit ici :
    http://msdn.microsoft.com/library/de...tlcolorbtn.asp

    Cependant, il y a de fortes chances que ça ne fonctionne pas, le bouton se dessinant seul sous Delphi. Il faut dériver un composant pour arriver au résultat escompté...
    Si :
    Cependant, il y a de fortes chances que ça ne fonctionne pas
    Justement :
    Il faut dériver un composant pour arriver au résultat escompté...
    J'ai aussi essayé les technique décrites dans les méandre de MSDN, nada !

    Le composant ButtonWithColor me convient tout à fait. L'analyse du code nous montre justement qu'il est descendant de TButton.

    A+
    Rien n'est moins sur que l'incertain : Pierre DAC

  11. #11
    Membre averti Avatar de Soulama
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 619
    Points : 416
    Points
    416
    Apprends la science de celui qui sait, et enseigne ta science à celui qui ignore, comme ca, tu auras appris ce que tu ignores et utilisé ce que tu sais.

  12. #12
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Oui, ce que je voulais dire, c'est qu'il n'arrivera pas à changer la couleur d'un TButton Delphi en lui envoyant un message.
    Il faut créer un composant dérivé (de TButton par exemple... ) pour pouvoir choisir la couleur.

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  13. #13
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Apparement, j'suis pas prêt de réussir à changer la couleur de mes TButtons ...

    J'vais donc les remplacer par des JvImgBtn vu que j'ai déjà la bibliothèque JVCL d'installée.

    Cependant si quelqu'un sait comment faire pour changer la couleur d'un button standart de Delphi, ça m'intéresse !!!

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    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
    Citation Envoyé par Eric Sigoillot
    Si l'on s'en tient à MSDN, tu ne pourras pas changer la couleur du bouton à moins de le dessiner toi même.[/code]
    @++
    Si...et c'est bien mon idée...

    En fait, le problème de TButton, c'est que dans Params.style, borland ne met pas l'option BS_OWNERDRAW.

    Donc si on arrive à intercepter le passage de la structure de création de la fenètre bouton et de l'ajouter, y'a plus qu'a...

    Tout ce qui reste, c'est de gérer le WM_CTLCOLORBTN dans le parent du bouton, en "déviant" sa méthode WndProc comme je l'ai fait pour un TMemo ici :
    [Win32][D7] TMemo : afficher une image en arrière plan

    Bref, farfelu, mais pas impossible...

    Par contre, dériver le composant lui même, c'est forcément plus simple.
    Bidouilleuse Delphi

  15. #15
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    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, allez, comme je suis gentil je vous donne une solution 100% VCL, et ce n'est pas trop trop compliqué

    Une fiche et un bouton dessus, et ce code :
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtDlgs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        oldBtnProc : TWndMethod;
        Procedure MyBtnWndProc( Var msg : TMessage );
      public
        { Déclarations publiques }
        ABitmap:TBitmap;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ABitmap:=TBitmap.Create;
      // Sauvegarde la WndProc actuelle du bouton
      oldBtnProc := Button1.WindowProc;
      // Affecte une nouvelle procédure de fenêtre.
      Button1.WindowProc := MyBtnWndProc;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage('Coucou !');
    end;
     
    procedure TForm1.MyBtnWndProc(var msg: TMessage);
    Var hdcBtn : HDC;
        btnCanvas : TControlCanvas;
        i,j:Integer;
        AColor,OldColor:TColor;
    Begin
      OldBtnProc(msg);
      If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Or (msg.Msg = WM_NCPAINT) Then
      Begin
        btnCanvas := TControlCanvas.Create;  
        Try      
          btnCanvas.Control:=Button1;
          OldColor:=TColor(GetTextColor(btnCanvas.Handle));
          for i:=1 to Button1.ClientWidth-2 do
            for j:=1 to Button1.ClientHeight-2 do
            begin
              AColor:=btnCanvas.Pixels[i,j];
              if AColor<>OldColor
              then btnCanvas.Pixels[i,j]:=clyellow;
            end;
        Finally
          btnCanvas.Free;
        End;
      End;
    End;
     
    end.
    Qui a dit que c'était impossible ???
    Bidouilleuse Delphi

  16. #16
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Humpf ! Si c'est pas tordu ça... En plus niveau performance ça doit être limite

    En plus, quoiqu'on fasse, ça passera pas avec le thème XP
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    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
    Citation Envoyé par Eric Sigoillot
    Humpf ! Si c'est pas tordu ça... En plus niveau performance ça doit être limite

    En plus, quoiqu'on fasse, ça passera pas avec le thème XP


    Je t'assures qu'il n'y a aucun problèmes de perfs sur un Athlon 64 X2 5000+ AM2
    Bidouilleuse Delphi

  18. #18
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut

    Pardon d'insister, mais pourquoi ne pas utiliser le composant ButtonWithColor, qui permet aussi de mettre une image comme le TBitBtn ? En plus, le source représente un exellent didacticiel pour la création d'un composant descendant d'un autre composant.
    Rien n'est moins sur que l'incertain : Pierre DAC

  19. #19
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    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
    Citation Envoyé par Philippe Gormand

    Pardon d'insister, mais pourquoi ne pas utiliser le composant ButtonWithColor, qui permet aussi de mettre une image comme le TBitBtn ? En plus, le source représente un exellent didacticiel pour la création d'un composant descendant d'un autre composant.
    Bien sur ! mais là c'était (dans le désordre) :
    1) la flemme d'installer un nouveau composant
    2) un exercice de style.


    ta solution est bien sur de loin la plus simple Philippe
    Bidouilleuse Delphi

  20. #20
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Cette solution reste intéressante
    merci waskol ...
    .: La cosse : il n'y a que ça de vrai :.

Discussions similaires

  1. changer la couleur d'un bouton
    Par casavba dans le forum Excel
    Réponses: 5
    Dernier message: 12/09/2007, 18h14
  2. Changer la couleur d'un bouton
    Par bruno.wiesen dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/04/2007, 11h13
  3. Changer la couleur d'un bouton
    Par castel51 dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 02/11/2006, 10h36
  4. Réponses: 4
    Dernier message: 31/07/2006, 16h18
  5. Changer la Couleur d'un bouton
    Par fpinter dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 15/07/2006, 12h09

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