[WIN32]Histoires de couleurs...

Utilisateur anonyme - 7 juin 2004 à 17:44
 Utilisateur anonyme - 7 juin 2004 à 23:13
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

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

ciao...
BruNews, Admin CS, MVP Visual C++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
7 juin 2004 à 18: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;
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
7 juin 2004 à 18:30
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...
0
Utilisateur anonyme
7 juin 2004 à 18:35
çà 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-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
7 juin 2004 à 18:38
>>> Par contre j'ai essayé ce que tu as dit, et les fonds restent gris...

Ben alors là, je ne comprends pas. bizarre...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
7 juin 2004 à 18:44
peu importe, ce n'est pas ce que tu veux faire
0
Utilisateur anonyme
7 juin 2004 à 23:13
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)
0