Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1025 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°499564
Cyberpat92
Posté le 27-08-2003 à 13:34:32  profilanswer
 

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 ?

mood
Publicité
Posté le 27-08-2003 à 13:34:32  profilanswer
 

n°499570
gatorette
Posté le 27-08-2003 à 13:41:52  profilanswer
 

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


---------------
each day I don't die is cheating
n°499779
Cyberpat92
Posté le 27-08-2003 à 16:20:31  profilanswer
 

Merci bcp !

n°499851
Cyberpat92
Posté le 27-08-2003 à 17:30:52  profilanswer
 

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
n°499874
gatorette
Posté le 27-08-2003 à 17:50:00  profilanswer
 

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
n°500013
Cyberpat92
Posté le 27-08-2003 à 20:55:11  profilanswer
 

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:

n°500051
gatorette
Posté le 27-08-2003 à 21:34:53  profilanswer
 

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
n°500106
Cyberpat92
Posté le 28-08-2003 à 00:05:07  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Comment choisir la couleur de la bordure d'une image ?Contrôle d'un programme en Java
Changer l'ordre de tabulation dans un formulaireLignes en couleur dans un datagrid
[VB/VBA/Access] Changer le contenu d'une textBoxChanger par url la valeur d'une variable de session, possible ou pas?
changer la couleur du texte selon la ligne du tmemo , possible ?[bash] de la couleur et affichage de caractères spéciaux
Changer une image en fonction de la sélection d'un menu déroulant ? 
Plus de sujets relatifs à : Changer la couleur d'un controle en VC++ ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR