VS2010的MFC动态创建菜单
来源:互联网 发布:千里眼淘宝插件手机版 编辑:程序博客网 时间:2024/04/30 13:10
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、添加事件处理代码
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- /// <summary> Executes the dynamic menu item 1 action. </summary>
- ///
- /// <remarks> zhengzhe, 2011/10/23. </remarks>
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void CMainFrame::OnDynamicMenuItem1()
- {
- // TODO: 在此添加命令处理程序代码
- AfxMessageBox(_T("Dynamic menu item 1 clicked"));
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- /// <summary> Executes the dynamic menu item 2 action. </summary>
- ///
- /// <remarks> zhengzhe, 2011/10/23. </remarks>
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void CMainFrame::OnDynamicMenuItem2()
- {
- // TODO: 在此添加命令处理程序代码
- AfxMessageBox(_T("Dynamic menu item 2 clicked"));
- }
在类视图中,选择CMainFrame类,右键打开类向导,选择虚函数选项卡,选择OnShowPopupMenu,并单击添加函数,然后编辑。
- BOOL CMainFrame::OnShowPopupMenu (CMFCPopupMenu* pMenuPopup)
- {
- //---------------------------------------------------------
- // Replace ID_VIEW_TOOLBARS menu item to the toolbars list:
- //---------------------------------------------------------
- CMDIFrameWndEx::OnShowPopupMenu(pMenuPopup);
- if (pMenuPopup == NULL)
- {
- return TRUE;
- }
- if (pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)
- {
- if (CMFCToolBar::IsCustomizeMode ())
- {
- //----------------------------------------------------
- // Don't show toolbars list in the cuztomization mode!
- //----------------------------------------------------
- return FALSE;
- }
- pMenuPopup->RemoveAllItems ();
- CMenu menu;
- VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));
- CMenu* pPopup = menu.GetSubMenu(0);
- ASSERT(pPopup != NULL);
- if (pPopup)
- {
- pMenuPopup->GetMenuBar ()->ImportFromMenu (*pPopup, TRUE);
- }
- }
- //------------- Example --------------------//
- // 通过CommandToIndex方法查找资源号为ID_DYNAMIC_COMMANDS的 {Dynamic Command} 菜单项
- // 它将被替换为我们的动态菜单项
- // 在用户自定义模式下我盟保留这个菜单
- int iIndex = -1;
- if (!CMFCToolBar::IsCustomizeMode () &&
- (iIndex = pMenuPopup->GetMenuBar ()->CommandToIndex (ID_DYNAMIC_COMMANDS)) >= 0)
- {
- //在非自定义模式下,移除 {Dynamic Command} 菜单项
- pMenuPopup->RemoveItem (iIndex);
- pMenuPopup->InsertSeparator (iIndex); // 在最后插入一个分隔符
- // IDS_EDIT_MYITEM_1 and IDS_EDIT_MYITEM_1 在String表中定义了2个字符串IDS_EDIT_MYITEM_1和IDS_EDIT_MYITEM_2
- // for status text and tooltip
- pMenuPopup->InsertItem (
- CMFCToolBarMenuButton (IDS_EDIT_MYITEM_1, NULL, -1, _T("&MyItem 1")), iIndex + 1);
- pMenuPopup->InsertItem (
- CMFCToolBarMenuButton (IDS_EDIT_MYITEM_2, NULL, -1, _T("MyItem &2")), iIndex + 2);
- //不要忘了在消息映射中添加消息处理(ON_COMMAND)
- }
- //-------------------------------------------//
- return TRUE;
- }
6、添加未能自动生成的消息映射
- BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
- ……
- ON_COMMAND(IDS_EDIT_MYITEM_1, OnEditMyItem1)
- ON_COMMAND(IDS_EDIT_MYITEM_2, OnEditMyItem2)
- END_MESSAGE_MAP()
添加StringTable中得动态菜单字符串名称
7、在CMainFrame的OnCreate方法中注册Command
- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- ……
- m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC);
- //------------- Example --------------------//
- // 在自定义模式下不要允许修改这些哑菜单(dummy item)
- CList<UINT, UINT> lstProtectedCmds;
- lstProtectedCmds.AddTail (ID_DYNAMIC_COMMANDS);
- CMFCToolBarButton::SetProtectedCommands (lstProtectedCmds);
- //-----------------------------------------//
- }
第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 如何动态添加菜单
0 0
- VS2010的MFC动态创建菜单
- 基于VS2010的MFC动态菜单
- 基于VS2010的MFC动态菜单
- MFC动态创建菜单
- MFC动态创建菜单
- MFC动态创建菜单
- MFC动态创建右键菜单
- vs2015/mfc动态创建菜单
- (MFC) VS2010、VS2012动态添加菜单
- VS2010 MFC 创建动态按钮出错
- 动态菜单的创建
- MFC动态创建菜单及添加相应
- 关于VS2010 MFC菜单替换的问题??
- 在vs2010+MFC中动态添加菜单选项
- 在vs2010+MFC中动态添加菜单选项
- [MFC] MDI框架下 vs2010 动态添加菜单
- vs2010 mfc 菜单字体
- MFC的关键技术:动态创建
- 显示Intent,隐式Intent
- 2015年蓝桥杯省赛B组第7题--牌型种数
- java 内存分配及变量存储位置
- Linux安装php Memcached和pcntl扩展
- [编程题] 求正数数组的最小不可组成和
- VS2010的MFC动态创建菜单
- IOC之方法注入讲解
- Console命令详解,让调试js代码变得更简单
- ubuntu12.0.4 安装SSH服务
- 每次都会安装的XCode插件
- Android控件之DatePicker、TimePicker探究
- python笔记13--多线程
- lavaral5:实验楼构建大型网站(未完)
- DBCP连接池配置参数说明