FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013 Ajouter une question
Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture. Farscape
- Comment afficher un menu popup?
- Comment placer une coche sur un élément d'un menu ?
- Comment récupérer le menu sur la fenêtre principale ?
- Comment récupérer le menu de la fenêtre MDI active ?
- Comment activer et désactiver une ligne d'un menu ?
- Comment changer dynamiquement le menu de la MainFrame ?
- Comment modifier le menu système ?
- A partir des ressources: Créer un menu dans les ressources (dans l'exemple l'identifiant est IDR_POPUPMENU).
Code c++ : Sélectionner tout CMenu menu; ClientToScreen(&point); menu.LoadMenu(IDR_POPUPMENU); ASSERT (menu.m_hMenu != NULL); CMenu* p_popup=menu.GetSubMenu(0); ASSERT (p_popup != NULL); int nResult = p_popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); //Agir en fonction du résultat retourné. //0 indique que le menu a été annulé //Sinon, comparer le resultat avec les identifiants des différentes options menu.DestroyMenu();
- A la main.
Code c++ : Sélectionner tout CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, 1, "Premiere option"); menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_STRING | MF_GRAYED, 2, "Deuxieme option"); int Result = menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); //Agir en fonction du résultat retourné
- TPM_CENTERALIGN : Centers the pop-up menu horizontally relative to the coordinate specified by x.
- TPM_LEFTALIGN : Positions the pop-up menu so that its left side is aligned with the coordinate specified by x.
- TPM_RIGHTALIGN : Positions the pop-up menu so that its right side is aligned with the coordinate specified by x. The mouse-button flag can be either of the following:
- TPM_LEFTBUTTON : Causes the pop-up menu to track the left mouse button.
- TPM_RIGHTBUTTON : Causes the pop-up menu to track the right mouse button.
Le changement doit se faire sur la notification de message :ON_UPDATE_COMMAND_UI de l'item concernée.
Code c++ : | Sélectionner tout |
1 2 3 4 5 | CMainFrame::OnUpdateAttach(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_bAttach); // suivant m_bAttach c'est coché ou non } |
Le menu est récupérable à partir de la mainframe :
Code c++ : | Sélectionner tout |
1 2 | CMenu* pTopLevelMenu= AfxGetMainWnd()->GetMenu() ; |
Dans une application MDI pour chaque View créée on peut définir un menu spécifique .
La sélection du menu est faite lors de la déclaration du CMultiDocTemplate :
Exemple :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 | CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MDICOLTYPE, RUNTIME_CLASS(CMDIColorViewDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CMDIColorView)); AddDocTemplate(pDocTemplate); |
A l'initialisation de la view le menu en question devient actif.
Comment faire pour récupérer un pointeur de la classe CMenu dessus ?
La séquence suivante ne fonctionnera pas, elle donnera accès au menu principal IDR_MAINFRAME.
Code c++ : | Sélectionner tout |
1 2 | CMenu* pTopLevelMenu= AfxGetMainWnd()->GetMenu() ; |
On passera plutôt par le … DocumentTemplate :
Code c++ : | Sélectionner tout |
1 2 3 4 | //à partir de la view CMultiDocTemplate *pDocTemplate=(CMultiDocTemplate *)GetDocument()->GetDocTemplate(); CMenu* pTopLevelMenu =CMenu::FromHandle(pDocTemplate->m_hMenuShared); |
La méthode traditionnelle pour rendre active ou non active une option d'un menu consiste à utiliser ClassWizard pour intercepter le message ON_UPDATE_COMMAND_UI sur la ligne de menu désiré et d'utiliser la fonction Enable de la classe CCmdUI
Code C++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | BEGIN_MESSAGE_MAP(CMDIColorView, CFormView) //{{AFX_MSG_MAP(CMDIColorView) ON_COMMAND(ID_ESSAIS_ITEM2, OnEssaisItem2) ON_UPDATE_COMMAND_UI(ID_ESSAIS_ITEM2, OnUpdateEssaisItem2)//}} AFX_MSG_MAPEND_MESSAGE_MAP() void CMDIColorView::OnUpdateEssaisItem2(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bEnableItem2); } |
m_bEnableItem2 est une variable utilisateur de type BOOL que l'on règle à TRUE ou FAUX à un endroit quelconque du programme.
Le rafraîchissement du menu se fait à son appel par l'utilisateur.
L'autre méthode consiste à accéder à la ligne dans le menu et de la désactiver.
Auparavant il faudra positionner la variable m_bAutoMenuEnable de la classe CFrameWnd à false.
Cette technique permet de réduire l'implémentation d'un trop grand nombre de fonctions ON_UPDATE_COMMAND_UI dans un programme.
Code C++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CMDIFrameWnd* pMainWindow=(CMDIFrameWnd*)AfxGetMainWnd(); pMainWindow->m_bAutoMenuEnable=false; BOOL bZoomed=FALSE; CMDIChildWnd* pChild=(CMDIChildWnd*)GetParentFrame(); CMultiDocTemplate *pDocTemplate=(CMultiDocTemplate *)GetDocument()->GetDocTemplate(); CMenu* pTopLevelMenu =CMenu::FromHandle(pDocTemplate->m_hMenuShared); if(pChild) bZoomed=pChild->IsZoomed(); CMenu *pMenu; // Get the File popup menu 4 from the top level menu. pMenu = pTopLevelMenu->GetSubMenu(4+bZoomed); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_DISABLED | MF_GRAYED ); |
Exemple : MDIColorView.zip
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | CMenu NewMenu; NewMenu.LoadMenu (IDR_MENU_NEW); AfxGetMainWnd()->SetMenu( &NewMenu ); AfxGetMainWnd()->DrawMenuBar(); NewMenu.Detach (); |
Le menu système contient des commandes permettant de réduire d'agrandir ou de fermer le programme,
Il est parfois utile de rajouter notre propre message dans ce menu, par exemple permettre l'accès de la boîte de dialogue " à propos de "
Voici comment procéder :
Dans la classe de base CWnd on dispose de la méthode GetSystemMenu qui nous retourne un pointeur sur un objet de la classe CMenu.
Il alors facile de rajouter des éléments dedans :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | // dans initInstance CMenu *pMenuSys= m_pMainWnd->GetSystemMenu(FALSE); pMenuSys->AppendMenu(MF_SEPARATOR); //ajoute un séparateur pMenuSys->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("A propos de ")); |
On commencera par rajouter le message WM_SYSCOMMAND avec l'assistant, puis dans la méthode engendrée :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) { // TODO: Add your message handler code here and/or call default if((nID & 0xFFF0)==ID_APP_ABOUT) { theApp.OnAppAbout(); } else CFrameWndEx::OnSysCommand(nID, lParam); } |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.