Menu dynamic utilisant MFC

J’aimerais append un élément de menu à mon menu principal, puis le remplir avec des éléments au moment de l’exécution. Comment je ferais ça? Et en plus d’append des éléments, comment pourrais-je avoir une entrée de carte de messages pour eux puisque je ne connais pas l’identifiant?

Vous pouvez créer un object CMenu dynamicment comme ceci:

 CMenu *menu = new CMenu; menu->CreatePopupMenu(); // Add items to the menu menu->AppendMenu(MF_STRING, menuItemID, "Text"); ... 

Ajoutez ensuite ce sous-menu à votre menu principal:

 wnd->GetMenu()->AppendMenu(MF_POPUP, (UINT_PTR)menu->m_hMenu, "Menu Name"); 

En ce qui concerne la carte des messages, en supposant que tous vos ID d’éléments de menu se situent dans une certaine plage, vous pouvez utiliser ON_COMMAND_RANGE pour mapper la plage entière à une seule fonction. Cette fonction recevra l’ID en tant que paramètre et vous pourrez y effectuer différentes opérations en fonction de l’ID.

 define the menu's using #define #define ID_SHOW 2002 #define ID_HIDE 2004 //create a menu object for main menu CMenu *menu = new CMenu(); menu->CreateMenu(); //another menu object for submenu CMenu *subMenu = new CMenu(); subMenu->CreatePopupMenu(); subMenu->AppendMenu(MF_STRING, ID_HIDE, _T("four")); subMenu->AppendMenu(MF_STRING, ID_SHOW, _T("three")); //append submenu to menu menu->AppendMenu(MF_POPUP|MF_STRING, (UINT)subMenu->m_hMenu, _T("Advanced") ); SetMenu(menu); 
  CMenu menuPopup; menuPopup.LoadMenu(IDR_CNTXT_PLAN); subMenu.CreatePopupMenu(); subMenu.AppendMenu(MF_STRING, MENU1,"Menu1"); subMenu.AppendMenu(MF_STRING, MENU2,"Menu2"); CMenu* pMenu = menuPopup.GetSubMenu(0); pMenu->InsertMenu(0,MF_BYPOSITION|MF_POPUP,(UINT)subMenu.m_hMenu,"Layers"); menuPopup.GetSubMenu(0)->InsertMenu(1,MF_BYPOSITION|MF_SEPARATOR,0,""); menuPopup.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);