Dialogbox, static et couleur (non MFC)

[Résolu]
Signaler
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008
-
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008
-
alors voilà
j'ai cherché un peu partout, dont ici, dans des exemples ou le forum pour changer la couleur d'un item (bouton ou autre)
Mais dans le cas qui m'interesse, je n'y arrive pas.
dans la dialogbox de config d'un screensaver (mais j'avais essayé avec un prog normal), je veux changer une couleur qui s'affichera donc dans un carré (pour la boite de dialogue de changement, j'ai vu un exemple)
quel type d'item doit etre utilisé pour montrer la couleur ? bouton, static bitmap(frame, rectangle...?)... ou directement faire un fillrect()

j'ai essayé plusieurs moyens (fillrect, wm_ctlcolorbtn, drawitem ou autre), mais rien ne fonctionne.
enfin si, j'ai réussi avec un fillrect mais...en ouvrant une dialogbox "About" à partir de la config et dans le wm_initdialog de la nouvelle dialogbox, j'ai fait un fillrect(GetDC(GetParent(hwnd)),&rect,brush) : et quand j'ai fermé le About, j'avais bien mon rectangle sur ma boîte de config mère !!!

mais si je fais la meme chose dans le initdialog de config, rien n'apparait.
bien sûr, si je fais un dialog de selection de couleur, de là je pourrai remplir la couleur, mais ce qui est gênant c'est au demarrage, l'initialisation des couleurs pas defaut qui ne s'affiche pas

ps: pas de MFC, ni de C++. je pense avoir vu quasi tous les sources à ce propos, mais j'y arrive pô

merci d'avance

11 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Pour la couleur des controles comme les boutons, les statics etc, tu peux regarder mon code source à ce sujet: 27889 Couleurs et transparence des controles.
Le dessin sur une boite de dialogue ne doit pas se faire pendant le traitement de WM_INITDIALOG car le HDC de la boite n'est pas encore disponible. C'est logique puisque la boite ne s'affiche que lorsque le traitement de ce message se termine par un return 0.
Pour dessiner sur la boite de dialogue, il faut traiter le message WM_PAINT:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
hdc =BeginPaint(hDlg,&ps);
Rectangle(hdc,.......);
FillRect(hdc,.....);
EndPaint( hDlg,&ps);
return 0;
}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Normalement, ton bouton devrait avoir la couleur voulue sans problème. Il suffit qu'il ait le style BS_OWNERDRAW. Il sera ensuite entièrement dessiné pandant le traitement du message WM_DRAWITEM. La structure DRAWITEMSTRUCT pointée par  lParam fournit le HDC et le RECT du bouton.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Le premier bouton radio doit avoir le style WS_GROUP. Tous les autres boutons radio appartenant à ce groupe ne doivent pas avoir ce style.
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

Pour le fillrect dans le WM_PAINT, ça marche

par contre, meme par rapport à votre source, j'ai essayé de créer un bouton de couleur, et bin rien, nada, marche pas.

donc je vais en rester à fillrect
Mais j'ai un nouveau probleme : j'ai bien recuperer la position du controle avec getwindowrect, mais ça ne fonctionne pas du tout ensuite avec fillrect!
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

hmm... bin oui, je vois bien dans l'exemple que ça marche
mais apparemment pas dans un ScreenSaver... (il utilise un LRESULT WINAPI ScreenSaverProc() pour le screensaver par lui meme, et un BOOL WINAPI ScreenSaverConfigDialog())
ou alors j'ai oublié quelque chose, une lib, je sais pas...c'est pas un truc qui ne marche que sur 2000/Xp avec le nouveau SDK? car je ne l'ai pas installé, j'ai l'ancien de VC6 (je sais pas trop comment basculer sur le nouveau pour le moment)

bon c'est point grave pour le moment, j'ai réussi avec mon FillRect (ça a été laborieux de trouver la bonne position pour le dessiner, mais bon...)
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

ce qui est bizarre, c'est que mon bouton disparait completement avec WM_DRAWITEM
pourtant il est bien visible et avec bs_ownerdraw
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

arggll
bon rappelez vos chien, la chasse est finie
ça marche maintenant... en fait c'est parce que mon bouton n'avait pas de texte
il faut que je mettre un espace (car il n'y a pas de texte justement)
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

bon allez, un autre truc Zarb :
j'ai 3 boutons radios
les 2 premiers se deselectionnent bien quand on clique sur l'un ou sur l'autre
mais si j'active le 3ème, le precedent n'est pas desactivé, et si je reactive le 1 ou le 2, le 3 reste toujours actif
au debut, je n'avais pas se probleme
une idée ??
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

ha d'accord !
merci merci
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

autre question : pour une mise à jour de la couleur en utilisant par exemple des boutons de preselection
quand je clique sur le bouton de la preselection 2 par exemple, bin le bouton change pas de couleur (la couleur envoyé dans WM_DRAWITEM est bien changée)
donc je pense qu'il faut faire un rappel de drawitem avec un SendMessage
mais c'est pour les params : il me dessine plus le bouton au bon endroit
comment definir le bon  dis->rcitem  ? avec getwindowrect il le decale vers la droite et vers le bas
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

OOooppss, couillon que je suis, la reponse était déjà sur le forum (InvalidateRect(hbutton,0,1)

sorry