IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

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

Sommaire →Classes Fen�tres et FrameWork →Les Menus (7)
pr�c�dent sommaire suivant
 

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

Mis � jour le 5 avril 2013 bigboomshakala Elrond

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 
}

Mis � jour le 5 avril 2013 farscape

Le menu est r�cup�rable � partir de la mainframe :

Code c++ : S�lectionner tout
1
2
  
CMenu* pTopLevelMenu= AfxGetMainWnd()->GetMenu() ;

Mis � jour le 5 avril 2013 farscape

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);
Le menu initialis� pour cette view sera le menu IDR_MDICOLTYPE
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);

Mis � jour le 5 avril 2013 farscape

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

Mis � jour le 5 avril 2013 farscape

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 ();

Mis � jour le 5 avril 2013 farscape

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 "));
Maintenant il nous faut intercepter le message, l'emplacement le plus adapt� �tant dans la classe CMainFrame:
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); 
}

Mis � jour le 7 juillet 2008 farscape

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 �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les 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.