Dialogbox, static et couleur (non MFC)

Résolu
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008 - 16 sept. 2006 à 02:15
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008 - 19 sept. 2006 à 18:07
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

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 sept. 2006 à 03:09
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;
}
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 sept. 2006 à 18:02
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.
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 sept. 2006 à 20:39
Le premier bouton radio doit avoir le style WS_GROUP. Tous les autres boutons radio appartenant à ce groupe ne doivent pas avoir ce style.
3
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
16 sept. 2006 à 16:57
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!
0

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

Posez votre question
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
16 sept. 2006 à 18:44
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...)
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
16 sept. 2006 à 18:51
ce qui est bizarre, c'est que mon bouton disparait completement avec WM_DRAWITEM
pourtant il est bien visible et avec bs_ownerdraw
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
16 sept. 2006 à 19:02
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)
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
16 sept. 2006 à 19:38
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 ??
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
16 sept. 2006 à 21:09
ha d'accord !
merci merci
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
19 sept. 2006 à 15:55
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
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
19 sept. 2006 à 18:07
OOooppss, couillon que je suis, la reponse était déjà sur le forum (InvalidateRect(hbutton,0,1)

sorry
0
Rejoignez-nous