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

这段代码第一次点击时,会在第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. STM32F103驱动ADS1118

    ADS1118 作为常用温度测量芯片被越来越多的开发者熟知,TI官方给出的是基于 MSP430 的驱动测试程序,由于 STM32 的普及,闲暇中移植了 MSP430 的 ADS1118 驱动程序到 S ...

  2. C#使用正则表达式获取HTML代码中a标签里包含指定后缀的href的值

    //C#使用正则表达式获取HTML代码中a标签里包含指定后缀的href的值,表达式如下: Regex regImg = new Regex(@"(?is)<a[^>]*?href ...

  3. hive、Hbase、mysql的区别

    1.Hive和HBase的区别 1)hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce. 2)hive是面向行存储的数据库. 3)Hive本身 ...

  4. mac中如何复制拷贝文件或文件夹的路径

    copy path in Mac 首先打开 automator(自动操作) 然后 最后command+s保存,命名为copy path. 然后随便找个文件右击,选择服务,再选择 copy path , ...

  5. 位运算基础(Uva 1590,Uva 509题解)

    逻辑运算 规则 符号 与 只有1 and 1 = 1,其他均为0 & 或 只有0 or 0 = 0,其他均为1 | 非 也就是取反 ~ 异或 相异为1相同为0 ^ 同或 相同为1相异为0,c中 ...

  6. Python - 超好用的第三方库pathlib,快速获取项目中各种路径

    前言 之前曾介绍过Python的os库详细使用方式,具体可看看这篇博文:https://www.cnblogs.com/poloyy/p/12341231.html 博主在学完os库之后,就开始投入使 ...

  7. 【原创】(四)Linux进程调度-组调度及带宽控制

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  8. docker 升级后启动异常处理

    docker升级后启动时提示如下错误: Unable to create at Docker.Core.Pipe.NamedPipeClient.d__5.MoveNext() --- End of ...

  9. 微信公众号 H5页面 支付注意细节

    1.   当秘钥(AppSecretApplets) 有问题时注意是不是已经被重置过了,此时要注意获取最新的秘钥: 2.   调试时后端的东西要放在线上https 请求 不然在手机上测试时 会被拦截: ...

  10. (转)ARM GNU常用汇编语言介绍

    ARM GNU常用汇编语言介绍 原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010445441611/ ARM汇编语言源程序语句,一般 ...