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

SommaireClasses Fenêtres et FrameWorkLes 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 © 2022 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.