Personailer les boites de dialogue

Signaler
Messages postés
25
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
26 septembre 2009
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
    Bonjour,
 je souhaiterais créer une boite de dialogue, mais lors de l'initialisation de celle-ci, je voudrais être capable de modifier la couleur et la taille de la police, ainsi que la couleur de fond de la fenêtre, celle des boutons etc....

Pour la couleur de fond, j'ai essayé avec SetBkColor (this, RGB (50,100,50)); dans OnInitDialog; mais Visual studio me dit

"imposssible de convertir le paramètre 1 de CVisualidmDlg * const en HDC"

N'y aurait-il pas un moyen de faire celà plus simplement en passant dans les propriétés de l'objet? (et sinon où dois-je implanter le code?)

Merci

13 réponses

Messages postés
25
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
26 septembre 2009

J'ai du nouveau dans mon problème...

selon msdn, SetDialogBkColor est obsolète, et ils n'en disent pas plus...

Ils demandent de passer par un message: WM_CTLCOLOR. Ceci dit, je ne suis pas du tout à l'aisse avec la manipulation des messages de windows... j'ai bien trouvé un tutoriel dans un bouquin, mais celui-ci passe parle class wizard de Visual C++. Et comme par magie, bah moi je suis sous Visual studio 2005... donc sans class wizard.

Y aurait-il quelqu'un qui pourrait m'aider, parceque là franchement, je ne sais plus trop ou chercher... entre msdn online qui donne 3 méthodes différentes que je n'arrive pas a faire marcher, et MSDN local qui me donne d'autres infos, çà me mélange tout...

Donc quelqu'un aurait-il un exemple de code utilisant ces fameux messages (si possible avc un WM_CTLCOLOR) histoire que je puisse par la suite essayer de l'adapter à mon cahier des charges, à savoir obtenir des textes de couleur (vert rouge et jaune) le tout sur un fond noir.

Merci
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
Salut,

Une facon simple de creer des boites de dialogue et meme plus c'est GTK... C'est completement a coté de ton probleme mais en plus c'est portable et pas prise de tete.
Messages postés
25
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
26 septembre 2009

Bah oui mais j'ai un caheir des charges à suivre à la lettre :-s

Pas moyen de faire autrement
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Déjà WM_CTLCOLOR est obsolète aussi (version 16 bits de Windows), apparemment faut utiliser WM_CTLCOLORDLG plutôt...
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
ah ok je vois.... bah bon courage! Parce que la ce style de programmation je connais pas du tt
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Bon pour changer la couleur de fond :

dans l'initialisation de la boîte de dialogue tu crées un BRUSH de la couleur souhaitée (et tu le stockes quelque part)...
HBRUSH hbr_BackGround=CreateSolidVrush(RGB(...));

...que tu détruiras quand le dialogue se terminera.

ensuite dans la boucle de messages :
case WM_CTLCOLORDLG: return (INT_PTR)hbr_BackGround;

(j'espère que ca marche j'ai pas testé)

pour les textes je sais pas trop mais apparemment c'est pas très différent
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Pardon c'était pas boucle de message mais DialogProc

Finalement pour le texte, il s'agit du message WM_CTLCOLORSTATIC.

case WM_CTLCOLORSTATIC:
SetTextColor((HDC)wParam,RGB(...));
return hbr_BackGround; // ou tout autre BRUSH
Messages postés
25
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
26 septembre 2009

OK je testerais tou celà au bureau, merci déjà pour les réponses! çà me donne une piste un peu plus précise.

Cependant, qu'est-ce que le "DialogProc"? C'est la première fois que j'en entends parler...
Messages postés
25
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
26 septembre 2009

La boucle de messages, ce n'est pas ce fameux

//{{AFX_MSG_MAP

//}}AFX_MSG_MAP

Enfin les ON_WM_... qui y sont a l'intérieur?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Mouais, la méthode que j'ai filée c'est pour une prog purement native, cependant on dirait que tes ON_WM_... y ressemblent, ca doit être ça.
Une petite précision : en fait c'est pas toi qui te charges de changer la couleur (y a pas de SendMessage(...)), c'est simplement que, lorsque windows envoie une requête pour la couleur (et ça arrive souvent, à chaque affichage je suppose) tu lui retournes la couleur souhaitée. Ainsi si tu veux changer la couleur plus tard, tu as seulement à modifier le BRUSH retourné.
Messages postés
25
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
26 septembre 2009

En fait là ou je suis perdu surtout, c'est que je ne sais pas trop où placer le

case WM_CTLCOLORDLG: return (INT_PTR)hbr_BackGround;

J'ai essayé différents endroits mais la compilation aime pas trop le return.

A vrai dire, je n'ai aucun Switch ni autre Case dans toiut le projet, j'imagine que le problème de compil vient d'ici...?

Pourrais-tu m'indiquer où mettre le WM_CTLCOLORDLG?

merci :-)
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Jamais fait de MFC encore, toutefois peut-être ceci pourra-t-il aller.

dans ton bloc BEGIN_MESSAGE_MAP (le fameux AFX_MSG_MAP), tu rajoutes un item
ON_MESSAGE(WM_CTLCOLORDLG,fctColorDlg)
et tu implémentes (quelque part dans le fichier) la fonction fctColorDlg comme suit:
LRESULT fctColorDlg(WPARAM wParam,LPARAM lParam){return (LRESULT)hbr_BackGround;}

de même pour le texte:
ON_MESSAGE(WM_CTLCOLORSTATIC,fctTextColor)
et LRESULT fctTextolor(WPARAM wParam,LPARAM lParam){SetTextColor(...);return (LRESULT)hbr_BackGroud;}

Voila j'espère que tu peux insérer un truc dans ce genre
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Maintenant que j'y pense : l'implémentation des fonctions (fctColorDlg fctTextColor...) tu la mets n'importe où dans un fichier .cpp. Mais leur déclaration tu peux la mettre (il faut, peut-être) dans le header après le bloc AFX_MSG et avant DECLARE_MESSAGE_MAP.