j'aimerai pouvoir changer la couleur de fond d'un static, ou meme d'un
element picture (mon but et juste d avoir un carré rempli d'une
couleur) en cliquant sur des boutons! Par exemple j'ai deux boutons,
lorsque je clique sur le premier, le static se colorie en bleue, et l
autre bouton le colorie en rouge!
J'ai cherché un moment sur ce site, mais je ne trouve que des sources
expliquant comment definire ces couleurs de fond au chargement!
Et quand je tatais les codes pour comprendre, bah ca me definissait
tous mes statics de mon dialog de la meme couleur de fond alor que je
definissais bien le mon HDC...
Si ca marche au chargement pourquoi ca marche pas lors d'un click ?
Tu bosses avec quoi ? WM_CTLCOLORSTATIC WM_PAINT WM_ERASEBACKGROUNG .....
IL y a plusieurs moyens d obtenir ca, tu as commencer a programmer avec quoi ?
Je vois, mais ou dis tu que le ID_STATIC devient de la couleur desiré?
Mon truc est un chouillat plus compliqué je t'explique
Dans ma fenetre de dialogue j'ai un treeview et plusieur static dont mon ID_COULEUR_FOND
j'aimerai que lorsque je clique sur un element de mon treeview que le static change de couleur.
Pour l'exemple on dira que le case 1 mon static ID_COULEUR_FOND a une
couleur background noir, case 2 il est bleu... et ainsi de suite.
Si vous pensez que je devrai utiliser un autre type que le static pour
arriver a mon but y a pas de souci! Ce que je veux c'est betement un
carré rempli d'une couleur!
Je code sous VSC++ 6 en API win32 sans MFC
Voici mon code: avec indication de l'endroit ou l'action doit changer la couleur:
MErci pour ton aide, ca marche presque, le probleme c'est que ce n'est
pas mon mon static d'id ID_COULEUR_FOND qui se color en rouge, mais un
carré se créé en haut a gauche de ma fenetre de dialogue!
voila le code comme je l'ai reecris avec tes indications en rouge, peut etre que tu trouvera mon erreur!
Encore un grand merci!
#include <windows.h>
#include "resource.h"
#include "TreeView.h"
#include "General.h"
STVMain objTreeView; // les données du TreeView
COLORREF clrBr = RGB (0xFF, 0x00, 0x00);
En fait ce n'est pas InvalidateRect qui envoie un WM_PAINT, c'est le système qui s'en occupe, voyant qu'une zoné a été invalidée:
"The system sends a WM_PAINT message to a window whenever its update
region is not empty and there are no other messages in the application queue for
that window."
Si on veut une mise à jour immédiate, il vaut mieux appeler UpdateWindow immédiatement après InvalidateRect.
Ce n'est pas évident, ca aurait très bien pu être InvalidateRect qui envoie le message...
Dans le cas présent le SendMessage(WM_PAINT) (qui est équivalent à UpdateWindow) ne sert à rien, mais parfois ca peut être utile
Peut etre que je l'integre mal a mon code! Vous pourriez verifier par
rapport au code que j'ai mis ce que je dois changer? Les parties sont
les ajout fait d apres vos recommandations (voir page1)
Salut,
Voici une autre piste.
Si tu veux juste que la couleur d'un carré change suivant une certaine action, tu peux utiliser la fonction FillRect(). Tu déclareras un tableau de HBRUSH qui contiendra les couleurs à utiliser. Ces dernières seront créées avec CreateSolidBrush() pendant l'initialisation de la boite de dialogue. Un indice permettra de choisir la couleur courante. Pour la changer, il suffira de changer l'indice courant est redessiner le carré avec la couleur correspondante.
// Variables dans la fonction WndProc:
static int indice;
static HBRUSH couleurs[3];
static RECT rect;
HDC hdc;
// Initialisation de la boite de dialogue:
case WM_INITDALOG:
couleurs[0]=CreateSolidBrush(RGB(255,0,0));//rouge
couleurs[1]=CreateSolidBrush(RGB(0,255,0));//vert
couleurs[2]=CreateSolidBrush(RGB(0,0,255));//bleu
SetRect(100,20,140,60);
indice=0;
//...
return 0;
A la suite d'une action, on change l'indice courant et redessine le carré comme ceci:
indice=1;// pour passer au vert
hdc=GetDC(hDlg);
FillRect(hdc,&rect,couleurs[indice]);
ReleaseDC(hDlg,hdc);
Pour que le carré ne disparaisse pas suite à un masquage de la boite de dialogue, il faut prévoir de le redessiner pendant WM_PAINT:
case WM_PAINT:
PAINTSTRUCT ps;
hdc=BeginPaint(hDlg,&ps);
FillRect(hdc,&rect,couleurs[indice]);
EndPaint(hDlg,&ps);
return 0;
Il ne faut pas oublier de libérer les HBRUSH en fin d'utilisation:
WM_CLOSE:
DeleteObject(couleurs[0]);
DeleteObject(couleurs[1]);
DeleteObject(couleurs[2]);
//....
return 0;
Si tu veux écrire dans le carré tu peux utiliser DrawText().
Voilà, j'espère avoir aidé un peu.