IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Classes Fenêtres et FrameWork > Les Menus
        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 ?



Comment afficher un menu popup?
auteurs : Elrond, Nourdine Falola
  • A partir des ressources: Créer un menu dans les ressources (dans l'exemple l'identifiant est IDR_POPUPMENU).
    
    	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.
    
    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.

Comment placer une coche sur un élément d'un menu ?
auteur : Farscape
Le changement doit se faire sur la notification de message :ON_UPDATE_COMMAND_UI de l'item concernée.

CMainFrame::OnUpdateAttach(CCmdUI* pCmdUI) 
{
     pCmdUI->SetCheck(m_bAttach); // suivant m_bAttach c'est coché ou non
}

Comment récupérer le menu sur la fenêtre principale ?
auteur : Farscape
Le menu est récupérable à partir de la mainframe :

CMenu* pTopLevelMenu= AfxGetMainWnd()->GetMenu() ;

Comment récupérer le menu de la fenêtre MDI active ?
auteur : 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 :

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.

CMenu* pTopLevelMenu= AfxGetMainWnd()->GetMenu() ;


On passera plutôt par le ? DocumentTemplate :

//à partir de la view
CMultiDocTemplate *pDocTemplate=(CMultiDocTemplate *)GetDocument()->GetDocTemplate();
CMenu* pTopLevelMenu =CMenu::FromHandle(pDocTemplate->m_hMenuShared);

Comment activer et désactiver une ligne d'un menu ?
auteur : 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
 
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.

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


Comment changer dynamiquement le menu de la MainFrame ?
auteur : Farscape

    CMenu NewMenu;
    NewMenu.LoadMenu (IDR_MENU_NEW);
    AfxGetMainWnd()->SetMenu( &NewMenu );
    AfxGetMainWnd()->DrawMenuBar();
    NewMenu.Detach ();

Comment modifier le menu système ?
Créé le 07/07/2008[haut]
auteur : 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 :

 // 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 :

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


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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 © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.