VS2010的MFC动态创建菜单

http://blog.csdn.net/password318/article/details/6898901

1、创建菜单资源

新建IDR_DYNAMIC_MENU,制作如下菜单,其中“动态菜单1”,“动态菜单2”的属性popup为false,并设定ID为ID_DYNAMIC_ITEM1和ID_DYNAMIC_ITEM2,中间的分隔符在Caption属性中输入"-",并设置popup为false,separator为true。

为系统菜单添加一个类似placeholder的菜单项,其Caption,ID,popup类型如图所示。

2、添加菜单单击事件处理

在菜单右键选择添加事件处理程序

在打开的事件处理对话框中,选择事件处理的类为CMainFrame,消息类型为COMMAND,处理函数的名字为OnDynamicMenuItem1

按照同样的方式添加处理函数OnDynamicMenuItem2事件处理程序

3、添加事件处理代码

[cpp]  view plain copy
  1.   
  2. ///  Executes the dynamic menu item 1 action.   
  3. ///  
  4. ///  zhengzhe, 2011/10/23.   
  5.   
  6.   
  7. void CMainFrame::OnDynamicMenuItem1()  
  8. {  
  9.     // TODO: 在此添加命令处理程序代码  
  10.     AfxMessageBox(_T("Dynamic menu item 1 clicked"));  
  11. }  
  12.   
  13.   
  14. ///  Executes the dynamic menu item 2 action.   
  15. ///  
  16. ///  zhengzhe, 2011/10/23.   
  17.   
  18.   
  19. void CMainFrame::OnDynamicMenuItem2()  
  20. {  
  21.     // TODO: 在此添加命令处理程序代码  
  22.     AfxMessageBox(_T("Dynamic menu item 2 clicked"));  
  23. }  
4、为CMainFrame类添加OnShowPopupMenu重载函数

在类视图中,选择CMainFrame类,右键打开类向导,选择虚函数选项卡,选择OnShowPopupMenu,并单击添加函数,然后编辑。


[cpp]  view plain copy
  1. BOOL CMainFrame::OnShowPopupMenu (CMFCPopupMenu* pMenuPopup)  
  2. {  
  3.     //---------------------------------------------------------  
  4.     // Replace ID_VIEW_TOOLBARS menu item to the toolbars list:  
  5.     //---------------------------------------------------------  
  6.     CMDIFrameWndEx::OnShowPopupMenu(pMenuPopup);  
  7.   
  8.     if (pMenuPopup == NULL)  
  9.     {  
  10.         return TRUE;  
  11.     }  
  12.   
  13.     if (pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)  
  14.     {  
  15.         if (CMFCToolBar::IsCustomizeMode ())  
  16.         {  
  17.             //----------------------------------------------------  
  18.             // Don't show toolbars list in the cuztomization mode!  
  19.             //----------------------------------------------------  
  20.             return FALSE;  
  21.         }  
  22.   
  23.         pMenuPopup->RemoveAllItems ();  
  24.   
  25.         CMenu menu;  
  26.         VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));  
  27.   
  28.         CMenu* pPopup = menu.GetSubMenu(0);  
  29.         ASSERT(pPopup != NULL);  
  30.   
  31.         if (pPopup)  
  32.         {  
  33.             pMenuPopup->GetMenuBar ()->ImportFromMenu (*pPopup, TRUE);  
  34.         }  
  35.     }  
  36.   
  37.     //------------- Example --------------------//  
  38.   
  39.     // 通过CommandToIndex方法查找资源号为ID_DYNAMIC_COMMANDS的 {Dynamic Command} 菜单项  
  40.     // 它将被替换为我们的动态菜单项  
  41.     // 在用户自定义模式下我盟保留这个菜单  
  42.     int iIndex = -1;  
  43.     if (!CMFCToolBar::IsCustomizeMode () &&  
  44.         (iIndex = pMenuPopup->GetMenuBar ()->CommandToIndex (ID_DYNAMIC_COMMANDS)) >= 0)  
  45.     {  
  46.         //在非自定义模式下,移除 {Dynamic Command} 菜单项  
  47.         pMenuPopup->RemoveItem (iIndex);  
  48.   
  49.         pMenuPopup->InsertSeparator (iIndex); // 在最后插入一个分隔符  
  50.         // IDS_EDIT_MYITEM_1 and IDS_EDIT_MYITEM_1 在String表中定义了2个字符串IDS_EDIT_MYITEM_1和IDS_EDIT_MYITEM_2  
  51.         // for status text and tooltip  
  52.         pMenuPopup->InsertItem (  
  53.             CMFCToolBarMenuButton (IDS_EDIT_MYITEM_1, NULL, -1, _T("&MyItem 1")), iIndex + 1);  
  54.         pMenuPopup->InsertItem (  
  55.             CMFCToolBarMenuButton (IDS_EDIT_MYITEM_2, NULL, -1, _T("MyItem &2")), iIndex + 2);  
  56.   
  57.         //不要忘了在消息映射中添加消息处理(ON_COMMAND)   
  58.     }  
  59.       
  60.     //-------------------------------------------//  
  61.       
  62.     return TRUE;  
  63. }  

6、添加未能自动生成的消息映射

[cpp]  view plain copy
  1. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)  
  2.     ……  
  3.     ON_COMMAND(IDS_EDIT_MYITEM_1, OnEditMyItem1)  
  4.     ON_COMMAND(IDS_EDIT_MYITEM_2, OnEditMyItem2)  
  5. END_MESSAGE_MAP()  


添加StringTable中得动态菜单字符串名称

7、在CMainFrame的OnCreate方法中注册Command

[cpp]  view plain copy
  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)  
  2. {  
  3.     ……  
  4.   
  5.     m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC);  
  6.   
  7.     //------------- Example --------------------//  
  8.     // 在自定义模式下不要允许修改这些哑菜单(dummy item)  
  9.     CList<UINTUINT> lstProtectedCmds;  
  10.     lstProtectedCmds.AddTail (ID_DYNAMIC_COMMANDS);  
  11.     CMFCToolBarButton::SetProtectedCommands (lstProtectedCmds);  
  12.     //-----------------------------------------//  
  13. }  


第53行亦可改为:CMFCToolBarMenuButton (IDS_EDIT_MYITEM_1, NULL, -1, _T("&MyItem 1")), - 1);  
54行        : CMFCToolBarMenuButton (IDS_EDIT_MYITEM_2, NULL, -1, _T("MyItem &2")), -1); 

其他参考   http://blog.csdn.net/pcliuguangtao/article/details/5976330
                  在vs2010+MFC中动态添加菜单选项
                  VS2010 MFC 如何动态添加菜单

你可能感兴趣的:(MFC)