Changer la couleur d'un controle en VC++ ?

Changer la couleur d'un controle en VC++ ? - C++ - Programmation

Marsh Posté le 27-08-2003 à 13:34:32    

J'ai un formulaire avec un controle text simple, j'ai trouvé comment changer la police (taille, corps, etc.) mais pas moyen de changer la couleur ?

Reply

Marsh Posté le 27-08-2003 à 13:34:32   

Reply

Marsh Posté le 27-08-2003 à 13:41:52    

WM_CTLCOLOREDIT ou WM_CTLCOLORSTATIC selon le type de ton "controle text simple"


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

Marsh Posté le 27-08-2003 à 16:20:31    

Merci bcp !

Reply

Marsh Posté le 27-08-2003 à 17:30:52    

J'y arrive tjrs po :cry:  
 
J'ai essayé avec WM_CTLCOLORSTATIC (car il s'agit bien d'un texte statique), mais ca marche po :(
 
J'ai aussi trouvé ca, mais c pas bon non plus !
 
// création de la font
_font = CreateFont(height, 0, 0, 0, weight, 0, underline, 0, 0, 0, 0, 0, 0, name);
 
HDC fontHdc = CreateDC("DISPLAY", NULL, NULL, NULL);
SelectObject(fontHdc, _font);
SetTextColor(fontHdc, 0xFFFFFF);
DeleteDC(fontHdc);


Message édité par Cyberpat92 le 27-08-2003 à 17:33:07
Reply

Marsh Posté le 27-08-2003 à 17:50:00    

Si tu utilises les MFCs, c'est le message WM_CTLCOLOR (donc la fonction OnCtlColor) que tu doit traîter.
Si tu programmes en API pure, tu traîtes le message WM_CTLCOLORSTATIC (en général avec un case WM_CTLCOLORSTATIC: dans ta procédure de boîte de dialogue).
 
Tu vérifie ensuite que le contrôle qui t'envoie la notification est bien celui qui t'intéresse. En MFC, tu vérifie le paramètre CWnd *pWnd et que le paramètre nCtlColor == CTLCOLOR_STATIC. En API pure, tu vérifie que le LPARAM lParam de ton message correspond bien au handle de ton contrôle (le HWND).
 
Enfin, tu fais appel aux fonctions de changement de couleur de texte et de fond sur le DC qui t'es fourni. En MFC, c'est pDC->SetBkColor( ... ) et pDC->SetTextColor( ... ). En API, c'est SetTextColor( (HDC)wParam, ... ) et SetBkColor( (HDC)wParam, ... )
 
Il ne faut pas oublier de retourner un HBRUSH valide sinon Windows va utiliser les couleurs systèmes. Avec les MFCs, il n'y a rien à faire car CDialog::OnCtlColor en renvoie un. Par contre avec l'API, c'est nécessaire. Un simple return( (LRESULT)::GetSysColorBrush(COLOR_3DFACE) ) peut suffire (à voir cependant avec XP et ses styles).
 
Voilà !
 
Code en MFC :

Code :
  1. HBRUSH CColoredDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  2. {
  3. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  4. if( (nCtlColor == CTLCOLOR_STATIC) && (pWnd->GetDlgCtrlID() == IDC_MYCOLOREDTEXT) )
  5. {
  6. pDC->SetBkColor( RGB(0xFF,0,0) );
  7. pDC->SetTextColor( RGB(0,0xFF,0) );
  8. }
  9. return hbr;
  10. }


 
Code en API:

Code :
  1. // dans ton traîtement des messages
  2. switch(uMsg)
  3. {
  4. // ...
  5. case WM_CTLCOLORSTATIC:
  6. {
  7. if( GetDlgCtrlID( (HWND)lParam ) == IDC_MYCOLOREDTEXT )
  8. {
  9. SetBkColor( (HDC)wParam, RGB(0xFF,0,0) );
  10. SetTextColor( (HDC)wParam, RGB(0,0xFF,0) );
  11. return( (LRESULT)::GetSysColorBrush(COLOR_3DFACE) );
  12. }
  13. break;
  14. }
  15. // ...
  16. }


 
-- Edit --
Ajout de la partie sur le brush à retourner suite à tests avec cyberpat92


Message édité par gatorette le 27-08-2003 à 21:42:41

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

Marsh Posté le 27-08-2003 à 20:55:11    

hé bé c'est exactement ce que j'avais fait, mais ca ne change rien :(
 
au cas où ca t'amuse de jeter un oeil, les sources sont là : http://xplaya2.free.fr/_fu032r5src.rar
 
C'est dans WizardPage::_DialogProc1()
 
Moi finalement je trouve que du texte en noir c'est pas si mal :whistle:

Reply

Marsh Posté le 27-08-2003 à 21:34:53    

cyberpat92 a écrit :

hé bé c'est exactement ce que j'avais fait, mais ca ne change rien :(


Je n'avais pas testé le code API pure, mais le code MFC fonctionne. En fait, le problème vient du fait qu'il faut renvoyer un HBRUSH et que malgré ce que j'ai compris dans la MSDN renvoyer TRUE ne suffit pas.
J'ai corrigé mon post au dessus pour montrer cela.
 

cyberpat92 a écrit :

Moi finalement je trouve que du texte en noir c'est pas si mal :whistle:


C'est même ce qu'il y a de mieux !
En effet, il est possible sous Windows de configurer les couleurs que l'on veut utiliser pour les contrôles et même, avec XP, il est possible d'aller plus loin avec les styles. Imagine que certains utilisateurs ont passé des heures à ajuster tout cela pour avoir un bureau "à eux". Je ne suis pas sûr qu'ils soient heureux de voir une application qui casse tout.
Il faut vraiment avoir des besoins particuliers pour devoir changer les couleurs. Et même dans les cas où c'est obligatoire, il faut utiliser le plus possible les couleurs systèmes (GetSysColor).


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

Marsh Posté le 28-08-2003 à 00:05:07    

[:yaisse]
 
Merci, merci beaucoup ! :bounce:

Reply

Sujets relatifs:

Leave a Replay

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