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

这段代码第一次点击时,会在第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. Rails工程实战记录

    项目git:https://github.com/yixiaoyang/ruby 为熟悉Rails的基本特性创建的工程,本博文仅作更新记录. (1)2013.10.1-2013.10.5 Ruby基本 ...

  2. Android下的定时任务

    Android中的定时任务一般有两种实现方式,一种是使用JavaAPI里的Timer类,另一种是使用android的Alarm机制. 这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的 ...

  3. 【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载

    类加载器的命名空间 每个类加载器又有一个命名空间,由其以及其父加载器组成 类加载器的命名空间的作用和影响 每个类加载器又有一个命名空间,由其以及其父加载器组成 在每个类加载器自己的命名空间中不能出现相 ...

  4. 何用Java8 Stream API进行数据抽取与收集

    上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...

  5. VMware安装CentOS6.X 系统

    1.虚拟机中的"CD/DVD(IDE)"配置好Linux映像文件后,打开虚拟机,点击"开启此虚拟机" 2.进入光盘启动界面,选择第一项,表示安装升级Linux系 ...

  6. 攻防世界Mobile5 EasyJNI 安卓逆向CTF

    EasyJNI 最近正好在出写JNI,正好看到了一道JNI相关的较为简单明了的CTF,就一时兴起的写了,不得不说逆向工程和正向开发确实是可以互补互相加深的 JNI JNI(Java Native In ...

  7. 【Spring Data 系列学习】Spring Data JPA 基础查询

    [Spring Data 系列学习]Spring Data JPA 基础查询 前面的章节简单讲解了 了解 Spring Data JPA . Jpa 和 Hibernate,本章节开始通过案例上手 S ...

  8. 正式学习MVC 03

    1.View -> Controller的数据通信 1) 通过url查询字符串 public ActionResult Index(string user) { return Content(u ...

  9. Typecho 主题制作记录

    模板制作快速入门 模板的制作并非难事,只要你写好了HTML和CSS,嵌套模板就非常简单了,你无需了解标签的内部结构,你只要会使用,模板就能迅速完成.这篇文章只简单的介绍了常用标签的使用方法,希望能带你 ...

  10. emmet快速缩写展开的基本写法与心得

    emmet的基本写法: .ct 点是class <div class="ct"></div> #ct 井号是id <div id="ct&q ...