Динамическое меню с использованием MFC - PullRequest
12 голосов
/ 09 сентября 2010

Я хотел бы добавить пункт меню в главное меню, а затем заполнить его пунктами во время выполнения. Как бы я это сделал? И помимо добавления элементов, как у меня будет запись карты сообщений для них, так как я не знаю идентификатор?

Ответы [ 3 ]

18 голосов
/ 09 сентября 2010

Вы можете динамически создать объект CMenu, например:

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

Затем добавьте это подменю в главное меню:

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

Что касается карты сообщений,предполагая, что все ваши идентификаторы пунктов меню находятся в определенном диапазоне, вы можете использовать ON_COMMAND_RANGE, чтобы отобразить весь диапазон в одну функцию.Эта функция получит идентификатор в качестве параметра, и внутри функции вы можете выполнять различные операции на основе идентификатора.

9 голосов
/ 12 января 2012
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);
1 голос
/ 22 декабря 2014
  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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...