MFC : cocher un truc dans menu

Signaler
Messages postés
68
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
14 septembre 2007
-
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007
-
Salut je voudrai savoir comment on fait pr q qd on clique sur Affichage" par exemple, si on sélectionne ce kon veu afficher, il y ai une coche qui se mette devant pour dire q c validé.
Exemple : Affichage - Barre d'état .
Merci a ceux ki répondront

12 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Dans le classwizzard, lorsque tu veux associer une commande à un item de menu, tu sélectionne la classe cible, l'id de menu et ON_COMMAND. Dans la fonction générée, tu fait l'éxcution de la commande (et tu sauvegarde dans une variable l'état dans lequel tu es) Pour cocher ou désactiver cette commande, il suffit de faire la même chose mais cette fois il faut choisir ON_UPDATE_COMMAND_UI. Dans la fonction générée tu as un pointeur passé en paramètre avec lequel tu peux appeler les fonction SetCheck et Enable.
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

Salut

J'ai exactement le même problème que Buzu, à savoir que j'aimerais mettre une coche à côté de l'item menu sélectionné.

J'ai essayé avec le SetCheck et le Enable, mais aucun des deux ne
fonctionne (j'ai aussi essayé le SetText pour vérifier, il ne
fonctionne pas non plus).



Voici mon code :



void CTestinterfaceApp::OnUpdateAffichageKp(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck(1) ;

}



Pour arriver là, je suis passer par le ClassWizard, AddFunction sur le ON_UPDATE_COMMAND_UI puis EditCode.



Je bloque depuis un moment dessus :/ alors si quelqu'un se sent une âme de sauveur, qu'il ne se gène pas :)



Autre précision : le
ON_COMMAND n'est pas encore fait, je ne sais pas si c'est important
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Rajoute le ON_COMMAND c'est peut-être la cause (quand il n'y a pas de gestion de la commande le framework MFC désactive entièrement la commande de menu et du coup n'appelle peut-être pas OnUpdate).
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

Merci pour ta réponse.



J'ai essayé de remplir le ON_COMMAND, ça ne marche toujours pas (le ON_COMMAND fonctionne bien, mais toujours pas le SetCheck).



Une autre petite précision, peut-être utile : j'ai remarqué qu'on
pouvait choisir la classe dans laquelle mettre les ON_COMMAND et
ON_UPDATE, je les ai mis dans la classe se terminant par Dlg, est-ce
juste ? Si je les mets dans la classe se terminant par App, il me sort
quelques erreurs (sur GetDlgItem et UpdateData).
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Le OnUpdate ne fonctionne pas avec les Dialogs car cela est géré par la classe CFrameWnd et ses descendant or CDialog dérive directement de CWnd donc la gestion des menus dans un dialog n'est pas la même. Et avec les MFCs je ne sais plus comment il faut faire (peut-etre faire un GetMenu et cocher directement l'item)
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

Merci pour ta réponse.



http://c.developpez.com/faq/vc/?page=CDialog#CDialogOnUpdateCommandUI



J'ai trouvé ça, je teste de suite.
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

Je me réponds à moi-même ^^



Alors, la solution que je cite dans mon post précédent est *presque* la bonne. Je m'explique.



En suivant les conseils donnés sur le lien et sur MSDN, je peux utiliser le SetCheck, jusque là aucun problème.



Mais comment savoir si le menu est déjà coché ou pas ? De plus, pour
mon application, le menu déroulant donne 4 possibilités, toutes
exclusives l'une de l'autre (si on en choisit une, la précédente se
décoche).



Auriez-vous une idée pour régler ces 2 problèmes ?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
GetMenuState de CMenu devrait te donner l'état de l'item. L'autre solution c'est de sauveagrder toi même dans une variable quel est le menu que tu as coché la dernière fois.
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

Merci, tu es mon sauveur. Mon Jean-Paul 3 !



Je ne connaissais pas du tout CMenu, et en fouinant dans MSDN j'ai
trouvé CMenu::CheckMenuItem, le truc idéal pour ce que j'ai à faire.



Encore merci.
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

Bon j'ai parlé trop vite (c'est tout moi ça ^^).



Pour info, j'ai finalement pris CMenu::CheckMenuRadioItem, qui permet
de regrouper plusieurs options menu pour qu'elles ne soient jamais
cochées en même temps.



Voici mon code :




CMenu affichage ;

affichage.LoadMenu(IDR_MENU1) ; // Marche jusque là
affichage.CheckMenuRadioItem(ID_AFFICHAGE_KP,ID_AFFICHAGE_PRESSIONS,ID_AFFICHAGE_KPCORDE,MF_BYCOMMAND);





Voici le menu, c'est le seul dans toute l'application :

http://www.image-dream.com/image.php?image=1114069034.menu.jpg



La ligne du CheckMenuRadioItem me renvoit 0, donc une erreur, et quand
j'essaye de l'intercepter avec GetLastError, il me dit Erreur
0:Opération réussie, donc ça ne m'avance pas beaucoup :/



Je précise que je suis avec Visual C++ 6, et que je n'ai donc pas le
même prototype pour cette fonction que celui décrit sur la MSDN
actuelle (je ne peux pas mettre un handler en premier paramètre, le
reste est inchangé).



La description du forum dit qu'il est réservé aux personnes au bord du suicide, je crois que j'en suis pas loin...
Messages postés
4
Date d'inscription
mardi 16 novembre 2004
Statut
Membre
Dernière intervention
2 juin 2005

Au lieu de :
CMenu affichage ;
affichage.LoadMenu(IDR_MENU1) ;
affichage.CheckMenuRadioItem(ID_AFFICHAGE_KP,ID_AFFICHAGE_PRESSIONS,ID_AFFICHAGE_KPCORDE,MF_BYCOMMAND);


tu mets :

CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(2); // ici 2 désigne le sous-menu concerné : à toi de mettre le bon paramètre
submenu->CheckMenuRadioItem(ID_VUE1, ID_VUE2,nID, MF_BYCOMMAND);

Je sais pas si ça va t'aider
Bon courage sinon
Messages postés
11
Date d'inscription
vendredi 19 septembre 2003
Statut
Membre
Dernière intervention
2 mai 2007

En fait j'en suis arrivé à cette solution :)

Et effectivement c'est la bonne, elle fonctionne très bien.