Couleur de fond d'un bouton CONTROL d'une boite de dialogue

julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 12 févr. 2006 à 16:42
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 15 févr. 2006 à 13:06
'soir tout le monde :

alors j'ai une application où, dans une boite de dialogue, je peux choisir une couleur grâce à la fonction ChooseColor(...); bon ca marche, je récupère la couleur est tout, c'est nickel, mais je veux pouvoir afficher dans un cadre (lui meme dans la boite de dialogue) la couleur choisie
J'ai pensé pour cela à un CONTROL, combiné aux attributs SS_WHITERECT, SS_SUNKEN et WS_EX_CLIENTEDGE comme je l'ai vu dans une source ; dont je modifierais la couleur d'arîère plan, mai comment ?
A partir du handle du bouton (HWND pal), comment faire ? (si c'est possible)

Voilà eh ben merci d'm'avoir lu, et de répondre
Bonne soirée

6 réponses

wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
12 févr. 2006 à 23:44
hbrBackground = CreateSolidBrush(RGB(236,233,216));

voila :)
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 févr. 2006 à 11:40
Salut,

Voici une solution utilisant le sous-classement:

1- Tu déclares ceci en global:

WNDPROC OldStaticProc;

COLORREF couleur;



2- Tu crées et sous-classes le Static pendant WM_CREATE ou WM_INITDIALOG:

hStatic
=CreateWindowEx(WS_EX_CLIENTEDGE,"STATIC","",WS_CHILD | WS_VISIBLE |
SS_SUNKEN | SS_WHITERECT,0,0,100,25,hWnd,0,0,0);

OldStaticProc=(WNDPROC)SetWindowLong(hStatic,GWL_WNDPROC,(LPARAM)StaticProc);



3- Voici la procédure de sous-classement à placer juste après la déclaraion des variables globales:

LRESULT CALLBACK StaticProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{



if (message==WM_PAINT)

{

PAINTSTRUCT ps;

HDC hDC = BeginPaint(hwnd, &ps);

HBRUSH hBrush = CreateSolidBrush(couleur);

RECT rc;

GetClientRect(hwnd,&rc);

FillRect(hDC,&rc,hBrush);

DeleteObject(hBrush);

EndPaint(hwnd, &ps);

return 0;

}

return CallWindowProc(OldStaticProc, hwnd, message, wParam, lParam);

}



couleur est la couleur récupérée avec ChooseColor().
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 févr. 2006 à 12:07
Plutot que GetClientRect, autant utiliser le RECT dispo dans la structure ps.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 févr. 2006 à 16:12
C'est vrai, je l'ai oublié car j'ai fait vite. La procédure devient donc:

LRESULT CALLBACK StaticProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

if (message==WM_PAINT)

{

PAINTSTRUCT ps;

HDC hDC = BeginPaint(hwnd, &ps);

HBRUSH hBrush = CreateSolidBrush(couleur);

FillRect(hDC,&ps.rcPaint,hBrush);

DeleteObject(hBrush);

EndPaint(hwnd, &ps);

return 0;

}

return CallWindowProc(OldStaticProc, hwnd, message, wParam, lParam);

}

Le principe reste le même mais on gagne 2 lignes de code, et du temps à l'exécution. Merci pour la précision.

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

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 févr. 2006 à 23:48
J'ai oublié aussi de préciser qu'il faut ajouter:

InvalidateRect(hStatic,0,1);

juste après le changement de la valeur de couleur pour forcer le redessin du fond du static.

Voilà, je pense que c'est tout.
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
15 févr. 2006 à 13:06
Merci beaucoup, ca m'aide énormement !
Rejoignez-nous