一开始以我是这样做的,结果是错误的:

这段代码第一次点击时,会在第6个位置创建MFC菜单,我本以为再次点击,
menu->GetSubMenu(5)返回的值就不会为空了,但事实是它返回了NULL,所以这样做动态菜单不得行。

后来我通过百度,搜索出了下面的方法,进行了一点小小的总结。
首先需要在Resource.h文件里定义菜单的宏:

//自定义动态菜单
#define Dyn_Menu_MFC 5000

这里我只定义了一个,后面的菜单项都是直接写的数字。

为什么要定义这个,是因为,我们无法通过在在资源里的菜单添加命令那样为动态菜单添加处理函数。所以只能手动的取个标识ID,以便和对应的命令消息处理函数相匹配。

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(ID_TEST_MYOPEN, &CMainFrame::OnTestMyopen)
ON_COMMAND(Dyn_Menu_MFC, &CMainFrame::OnCommandTest)//处理函数
END_MESSAGE_MAP()

在MainFrame.h里加入:

public:
afx_msg void OnTestMyopen();
afx_msg void OnCommandTest();

在MainFrame.cpp加入:

void CMainFrame::OnCommandTest()
{
CMenu * menu = GetMenu();
CMenu * subMenu = menu->GetSubMenu(); if (subMenu != NULL) {
MessageBox(TEXT("c++学院"));
}
}

到这里c++学院菜单的处理函数就完成了。

下面这是详细的动态菜单构建代码:

CMenu subMenu, menuMain;

menuMain.CreateMenu();
subMenu.CreateMenu(); subMenu.AppendMenuW(MF_STRING | MF_ENABLED, Dyn_Menu_MFC,
TEXT("c++学院")); // 子项一 menuMain.AppendMenuW(MF_BYPOSITION | MF_POPUP | MF_STRING,
(UINT)subMenu.m_hMenu, TEXT("MFC"));//主菜单 subMenu.CheckMenuItem(, MF_BYPOSITION | MF_CHECKED); //从资源里的已有菜单动态添加到新菜单上
CMenu oldMenu;
oldMenu.LoadMenuW(IDR_MAINFRAME); //如果是想获得当前菜单
//GetMenu() menuMain.AppendMenuW(MF_BYPOSITION | MF_POPUP | MF_STRING,
(UINT)oldMenu.GetSubMenu()->m_hMenu, TEXT("资源中已存在的菜单")); //创建带有子菜单的学员分类菜单
CMenu sSubMenu;
sSubMenu.CreateMenu(); sSubMenu.AppendMenuW(MF_POPUP, , TEXT("初阶学员"));
//sSubMenu.AppendMenuW(MF_POPUP, 5556, TEXT("高阶学员")); //创建带有子菜单的高阶学员菜单
CMenu ssSubMenu; ssSubMenu.CreateMenu();
ssSubMenu.AppendMenuW(MF_STRING, , TEXT("高阶学员_子菜单")); sSubMenu.AppendMenuW(MF_BYPOSITION | MF_POPUP | MF_STRING,
(UINT)ssSubMenu.m_hMenu, TEXT("高阶学员")); menuMain.GetSubMenu()->AppendMenuW(MF_BYPOSITION | MF_POPUP | MF_STRING,
(UINT)sSubMenu.m_hMenu, TEXT("学员分类")); SetMenu(&menuMain);
menuMain.Detach();
subMenu.Detach();
oldMenu.Detach();
sSubMenu.Detach();
ssSubMenu.Detach();

MFC之创建多级动态菜单的更多相关文章

  1. EasyUI创建异步树形菜单和动态添加标签页tab

    创建异步树形菜单 创建树形菜单的ul标签 <ul class="easyui-tree" id="treeMenu"> </ul> 写j ...

  2. java 24 - 7 GUI之 创建多级菜单窗体

    需求: 创建多级菜单 步骤: A:创建窗体对象(并设置属性和布局) B:创建菜单栏 C:创建菜单和子菜单 D:逐步添加菜单(子菜单添加到菜单中,菜单添加到菜单栏中) E:窗体中设置菜单栏(菜单栏并不是 ...

  3. VC++ 创建一个动态增长的层叠菜单

    工作中需要创建一个动态增长的层叠菜单,类似于动态增长的多语言切换菜单,也是废了好大劲哪,分享一下,请交流参考. 类似效果图: 弹出子菜单各菜单项的意义一致,用ON_COMMAND_RANGE宏来统一实 ...

  4. ContextMenuStrip 动态添加多级子菜单

    1.首先要实例化几个ToolStripItem(要为某一父菜单添加几个子菜单就实例化几个):方法如下: /*添加子菜单*/ ToolStripItem ts_1 = new ToolStripMenu ...

  5. delphi创建动态菜单

    1.动态生成菜单项 varFirstItem: TMenuItem;SecondItem: TMenuItem; begin FirstItem := TMenuItem.Create(Self); ...

  6. Angularjs 根据数据结构创建动态菜单无限嵌套循环--指令版

    目标:根据数据生成动态菜单,希望可以根据判断是否有子集无限循环下去. 菜单希望的样子是这样的: 菜单数据是这样的: $scope.expanders = [{ title: 'title1', lin ...

  7. WIN 下的超动态菜单(一)

    WIN 下的超动态菜单(一)介绍 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/     ...

  8. [ PHP+jQuery ] ajax 多级联动菜单的应用:电商网站的用户地址选择功能 ( 二 ) - 仿亚马逊下拉面板

    /** jQuery version: 1.8.3 Author: 小dee Date: 2014.11.8 */ 接上一篇博客. 实现带缓存的仿亚马逊下拉面板 效果图: 图1 初始 图2 点击省份 ...

  9. 【vue】iView-admin2.0动态菜单路由

    vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...

随机推荐

  1. 寄生or独立 中国代工厂的悲惨抉择

    2015年苹果.三星.国产手机依旧外表光鲜,最起码,从出货量上看,他们的日子过得还不错,年终奖应该是能发得出来,但这些光鲜的品牌商背后,是一个个悲惨的代工厂,以及一个又一个"一将功成万骨枯& ...

  2. Circles of Waiting

    题目传送门 很容易列出期望的方程,高斯消元搞一波但是常规消元复杂度是$O(r^6)$的考虑从左到右从上到下编号然后按编号从小到大消元假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系 ...

  3. Fragment argument

    每个Fragment实例都可以附带一个Bundle对象,该bundle包含键值对,可以像附加extra到Activity的intent中那样使用他们.一个键值对即一个argument. 创建frage ...

  4. Flask设置Access-Control_Allow_Origin实现跨域访问

    前端访问Flask的接口,浏览器报错:has been blocked by CORS policy: No 'Access-Control-Allow-Origin' heade 需要将Flask的 ...

  5. Aajx

    # Ajax入门及基本开发 ## # Ajax的基本概念 >> 概念: 界面异步传输技术: 将几种技术和在一起进行开发的一种编程方式: >> 基本应用场景: > Goog ...

  6. 难道同事:Java 方法调用到底是传值还是传引用

    Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...

  7. 2017、2018面试分享(js面试题记录)记得点赞分享哦;让更多的人看到~~

    2017面试分享(js面试题记录) 1. 最简单的一道题 '11' * 2 'a8' * 3 var a = 2, b = 3; var c = a+++b; // c = 5 2. 一道this的问 ...

  8. cordova+vue打包ios调用相机闪退解决

    cordova+vue项目打包android,打开相机正常使用,但是打包ios后,需要多几个配置,才能打开,否则当调用的时候会闪退,上配置图 需要在选中的文件里面添加 <key>NSCam ...

  9. oracle单机数据库搭建巨详细文档

    规划 环境:redhat6.9 安装包:p13390677_112040_Linux-x86-64_1of7.zip p13390677_112040_Linux-x86-64_2of7.zip 数据 ...

  10. Docker 使用杂记 - 最佳实践尝试 - 实战

    目录 Docker 使用杂记 - 最佳实践尝试 - 实战 Docker简介 项目背景 内在原因 外在原因 基础镜像 需求 镜像维护者 工作文件夹 文件 ADD COPY 宗卷 命令 入口点 Docke ...