[Visual C++] Changer la couleur du texte d'un bouton ?

Changer la couleur du texte d'un bouton ? [Visual C++] - C++ - Programmation

Marsh Posté le 17-02-2003 à 22:28:35    

Malgré des recherches sur ce forum et sur Google (ah, et aussi dans mon bouquin de merde (Le Tout En Poche / Visual C++ 6.0)dans lequel y'a rien d'intéressant), j'ai pas trouvé de méthode simple pour changer la couleur du texte d'un bête bouton.
 
C'est faisable quand même, non ?  
Bon, bah merci d'avance :)

Reply

Marsh Posté le 17-02-2003 à 22:28:35   

Reply

Marsh Posté le 18-02-2003 à 01:24:34    

Il faut intercepter le message WM_CTLCOLORBTN dans ta fenêtre parente. Et je pense que juste faire un SetTextColor sur le DC qui t'ai donné doit suffire :
 

Code :
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. ...
  4. switch( message )
  5. {
  6. ...
  7. case WM_CTLCOLOR:
  8. {
  9. ::SetTextColor( reinterpret_cast<HDC>(wParam), RGB(0x99,0xCC,0xFF) );
  10. break;
  11. }
  12. ...
  13. }
  14. ...
  15. }


 
Si tu veux dessiner toi même ton contrôle, il te faut soit utiliser des contrôles "owner-drawn" et répondre au message WM_DRAWITEM, soit utiliser des contrôles "custom-drawn" et répondre à la notification NM_CUSTOMDRAW.


Message édité par gatorette le 18-02-2003 à 01:25:26

---------------
each day I don't die is cheating
Reply

Marsh Posté le 18-02-2003 à 11:53:32    

Merci beaucoup :)
 
Par contre est-ce que ça vient de moi ou est-ce que c'est vraiment mal foutu ? Je veux dire, ça fait beaucoup de code juste pour changer la couleur du texte...
Enfin bon, y'a sûrement quelque chose qui m'échappe  :sleep:

Reply

Marsh Posté le 18-02-2003 à 12:15:55    

C'est pas très bien foutu, mais c'est assez logique également.
 
En effet, il y a deux solutions : soit le parent envoie la commande au bouton "ChangeTextColor" (ou définit un style quelconque à la création du bouton), soit le bouton demande au parent s'il a des changements à apporter à  la façon dont il doit se dessiner.
 
La première solution à l'avantage de la simplicité. Dans le parent, tu fais juste un appel à une fonction une fois pour toute et quand tu veux changer, tu rappelles la fonction. Par contre, elle impose d'utiliser un grand nombre de messages (voir la longue liste des messages pour une ListView par exemple) et implique une programmation particulière du contrôle. De plus, tu es obligé d'envoyer le message à tous tes boutons.
 
La deuxième solution impose évidemment une gestion plus lourde, mais permet un fonctionnement très souple. En effet, en gérant le message WM_CTLCOLORBTN sans se préoccuper de qui l'envoie, on peut changer l'apparence de tous les boutons en une seule fois. De même, ce message est envoyé quand le bouton doit se redessiner (je pense), et l'on modifie directement le DC qu'utilise le bouton pour se dessiner (je suppose), cette méthode est donc un peu plus efficiente.  
 
Il me semble donc que pour une action finalement assez rare, c'est une assez bonne méthode.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 18-02-2003 à 13:18:21    

gatorette a écrit :

C'est pas très bien foutu, mais c'est assez logique également.
 
En effet, il y a deux solutions : soit le parent envoie la commande au bouton "ChangeTextColor" (ou définit un style quelconque à la création du bouton), soit le bouton demande au parent s'il a des changements à apporter à  la façon dont il doit se dessiner.
 
La première solution à l'avantage de la simplicité. Dans le parent, tu fais juste un appel à une fonction une fois pour toute et quand tu veux changer, tu rappelles la fonction. Par contre, elle impose d'utiliser un grand nombre de messages (voir la longue liste des messages pour une ListView par exemple) et implique une programmation particulière du contrôle. De plus, tu es obligé d'envoyer le message à tous tes boutons.
 
La deuxième solution impose évidemment une gestion plus lourde, mais permet un fonctionnement très souple. En effet, en gérant le message WM_CTLCOLORBTN sans se préoccuper de qui l'envoie, on peut changer l'apparence de tous les boutons en une seule fois. De même, ce message est envoyé quand le bouton doit se redessiner (je pense), et l'on modifie directement le DC qu'utilise le bouton pour se dessiner (je suppose), cette méthode est donc un peu plus efficiente.  
 
Il me semble donc que pour une action finalement assez rare, c'est une assez bonne méthode.


 
Merci beaucoup pour ces explications (et pour le lien qui va m'être très utile je pense) :)
 
Juste une dernière petite question : Tu as appris le C++ comment ? Je demande ça parce que t'as l'air assez calé(e). Là je commence tout juste à m'y mettre, et pour tout dire j'ai un peu de mal ( :o ).
 
Merci encore   :hello:

Reply

Marsh Posté le 18-02-2003 à 14:42:51    

_John_Doe_ a écrit :

Tu as appris le C++ comment ?


J'ai eu quelques cours C/C++ vraiment pas très avancés mais j'ai surtout appris par moi même. J'ai la chance de bosser dans une boîte où ils me laissent du temps pour apprendre (et répondre aux messages sur les forums !).
 

_John_Doe_ a écrit :

Je demande ça parce que t'as l'air assez calé(e).


Merci pour la remarque, mais sur le C/C++, je ne suis certainement pas le plus calé du forum ! C'est vrai par contre que mon boulot m'amène à pas mal bosser la prog. Windows et donc je m'y connais un peu là dedans.


---------------
each day I don't die is cheating
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed