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

这段代码第一次点击时,会在第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. Leetcode 141题 环形链表(Linked List Cycle) Java语言求解

    题目描述: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Map ...

  2. 达拉草201771010105《面向对象程序设计(java)》第十三周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十三周学习总结 第一部分:理论知识 事件处理基础: 事件源:能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事件 ...

  3. yii2设置默认控制器

    以Yii2高级模板配置为例

  4. d3学习day3 --y轴添加文本标签

    y轴添加文本标签 g.append("g") .call(y_axis) .append("text") .text("price($)") ...

  5. HTML5 Canvas(基础知识)

    最近笔者在学习HTML5的新元素<canvas>,会分享一些基础知识以及小例子,最终使用<canvas>实现一个绘制简单图表(条形图.线图或者饼图)的js库,会更新一到两篇文章 ...

  6. yuchuan_Linux_C 编程之七系统IO函数

    一.整体大纲 二. 系统IO函数 1. 一些概念    文件描述符     PCB     C库函的IO缓冲区 1) 文件描述符            int 类型            一个进程最多 ...

  7. xcode制作越狱包

    1.将运行目标选为iOS Device 2.Edit Scheme -> 选择 Run [App Name] -> Build Configuration下拉框中选择Release 3.生 ...

  8. celery异步任务 定时任务

    以前项目中用到过 celery ,但是没怎么记笔记,现在在记一下,方便以后用.   Celery.png 问:Celery 是什么? 答:Celery 是一个由 Python 编写的简单.灵活.可靠的 ...

  9. drf(请求封装/认证/权限/节流)

    1.请求的封装 class HttpRequest(object): def __init__(self): pass @propery def GET(self): pass @propery de ...

  10. 3分钟入门lambda表达式

    本节是lambda表达式的一个入门课,讲解的同时配有练习demo 前言什么是lambda表达式?基础语法函数式接口自己实现一个函数式接口jdk提供的函数式接口Consumersupplierfunct ...