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 éclairé
    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
    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 chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    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+

  3. #3
    Membre éclairé
    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
    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 chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    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.


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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    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 ?

  6. #6
    Membre éclairé
    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
    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 éclairé
    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
    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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    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.

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    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 :@++

  10. #10
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    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+

  11. #11
    Membre éclairé 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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    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.

    @++

  13. #13
    Membre éclairé
    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
    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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    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.

  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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    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 ???

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    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

  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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    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

  18. #18
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    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.

  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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    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

  20. #20
    Membre éclairé

    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
    Par défaut
    Cette solution reste intéressante
    merci waskol ...

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