2010-09-09 19 views
9

Me gustaría agregar un elemento de menú a mi menú principal y luego llenarlo con elementos en tiempo de ejecución. ¿Cómo haría esto? Y además de agregar elementos, ¿cómo podría tener una entrada de mapa de mensajes para ellos ya que no conozco la identificación?Menú dinámico usando mfc

Respuesta

15

se puede crear un objeto CMenu dinámicamente como esto:

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

A continuación, agregue este sub-menú a su menú principal:

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

En cuanto al mapa de mensajes, suponiendo que todo el elemento de menú Los ID están dentro de un cierto rango, puede usar ON_COMMAND_RANGE para asignar el rango completo a una sola función. Esta función recibirá la ID como un parámetro, y dentro de la función, puede realizar diferentes operaciones basadas en la ID.

8
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); 
0
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); 
Cuestiones relacionadas