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. Le 1er param�tre de TrackPopupMenu est une combinaison des options suivantes :
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 � 2026 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.



