[WIN32]Histoires de couleurs...

Signaler
Messages postés
27
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
19 juin 2004
-
Messages postés
27
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
19 juin 2004
-
Bonjour,

Je créé 2 edit à l'aide de CreateWindowEx() en readonly (style ES_READONLY).
Jusqu'à maintenant, la couleur de fond de ces 2 edit était grise.

Maintenant, toujours avec CreateWindowEx(), je rajoute un static dans lequel je mets un texte.
Ce texte, je le veux en rouge.
Je mets donc le code suivant dans la procédure de callback de ma fenêtre mère :
case WM_CTLCOLORSTATIC:		{
if( GetWindowLong((HWND)lParam, GWL_ID) == ID_ERREUR )	{
SetTextColor( (HDC)wParam, RGB(0xFF,0,0) );
SetBkMode( (HDC)wParam, TRANSPARENT );
return (LRESULT)GetStockObject(NULL_BRUSH);
}

} 
break;


çà marche, le texte est bien en rouge.
Mais ce que je ne comprends pas, c'est qu'avec le code ci-dessus, la couleur de fond de mes 2 edit en readonly est passée au blanc.
Pourquoi ?

Merci ! :o)

7 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Un EDIT readonly reagit au WM_CTLCOLORSTATIC (eh oui), alors verifie bien tes IDs et ta windproc.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
pour la couleur de fond, c'est la valeur de retour qui importe

HBRUSH hRedBrush = CreateSolidBrush(255);

...

case WM_CTLCOLORSTATIC: {
if( GetWindowLong((HWND)lParam, GWL_ID) == ID_ERREUR ) {
SetTextColor( (HDC)wParam, RGB(0xFF,0,0) );
SetBkMode( (HDC)wParam, TRANSPARENT );
return (LRESULT)hRedBrush;
}

}
break;
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
au temps pour moi j'ai dit n'importe quoi
Par contre j'ai essayé ce que tu as dit, et les fonds restent gris...
Messages postés
27
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
19 juin 2004

çà y est j'ai compris : le problème venait du fait que l'instruction return se trouvait dans le if. Dans les autres cas (et donc pour les edit readonly), le case ne renvoyait rien.

Pour modifier seulement la couleur du texte de ce static, il faut faire comme ceci :
case WM_CTLCOLORSTATIC:		{
SetBkMode( (HDC)wParam, TRANSPARENT );
if( (GetWindowLong((HWND)lParam, GWL_ID)) == ID_ERREUR )	{
SetTextColor( (HDC)wParam, RGB(0xFF,0,0) );
}
return (LRESULT)GetStockObject(NULL_BRUSH);
} 
break;


Merci ! 8-)
Messages postés
27
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
19 juin 2004

>>> Par contre j'ai essayé ce que tu as dit, et les fonds restent gris...

Ben alors là, je ne comprends pas. bizarre...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
peu importe, ce n'est pas ce que tu veux faire
Messages postés
27
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
19 juin 2004

Arf !!!
Finalement, je me suis aperçu en faisant la modification ci-dessus que j'avais un gros bug d'affichage dans mon programme, avec les fameux edit.
Et j'ai enfin trouvé la solution : mon code du début était bon, mais j'avais oublié un détail très important de la documentation, à propos du message WM_CTLCOLORSTATIC :

Default Action

The DefWindowProc function selects the default system colors for the static control.

Voilà le pourquoi :o)