创建一个基于对话框的工程,工程名为CreateMenu

为该对话框增加一个文件菜单项和测试菜单项,如下图所示

 

测试菜单项至少要有一个子菜单项

在对话框属性中关联该菜单

在resource.h中增加一个ID_TESTMENU宏

#define ID_TESTMENU          5000

在对话框中添加一个Button按钮,建立消息映射,编辑代码如下

void CCreateMenuDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    char buf[2];
    //获取顶级菜单
    CMenu* pMenu=GetMenu();
    //获取1级菜单
    CMenu* pFileMenu=pMenu->GetSubMenu(0);
    CMenu* pTestMenu=pMenu->GetSubMenu(1);
    //添加2级菜单
    if(pTestMenu->GetSafeHmenu()==NULL) 
        return;
    //添加一个2级弹出菜单,将"文件"菜单项作为该菜单的子菜单
    pTestMenu->AppendMenu(MF_POPUP,(UINT)pFileMenu->m_hMenu,"文件");
    //添加一个2级弹出菜单,该菜单的子菜单为空
    pTestMenu->AppendMenu(MF_POPUP,(UINT)pTestMenu->m_hMenu,"测试");
    //添加10个2级普通菜单
    for(UINT m_ID=1;m_ID<=10;m_ID++)
    {
        itoa(m_ID,buf,10);
        pTestMenu->AppendMenu(MF_SEPARATOR);
        pTestMenu->AppendMenu(
            MF_STRING,m_ID+ID_TESTMENU,"2级菜单"+CString(buf));
    }
 
    //添加n级菜单
    CMenu* pnMenu=pTestMenu->GetSubMenu(2);
    pnMenu->AppendMenu(MF_POPUP,(UINT)pnMenu->m_hMenu,"3级菜单");
    for(int i=0;i<5;i++)
    {
        pnMenu=pnMenu->GetSubMenu(0);
        if(pnMenu==NULL) return;
        itoa(i+4,buf,10);
        pnMenu->AppendMenu(
            MF_POPUP,(UINT)pnMenu->m_hMenu,buf + CString("级菜单"));
    }
    pnMenu->GetSubMenu(0)->AppendMenu(
        MF_STRING,ID_TESTMENU,"9级菜单");
}

响应单击菜单的事件

添加OnCommand的消息映射,编辑代码如下

BOOL CCreateMenuDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
    // TODO: Add your specialized code here and/or call the base class
    UINT uMsg=LOWORD(wParam);
    char buf[2];
    if(uMsg==ID_TESTMENU)
    {
                MessageBox("HELLO!");
    }
    for(UINT i=1;i<=10;i++)
    {
        if(uMsg==ID_TESTMENU+i)
        {
            itoa(i,buf,10);
            MessageBox("HELLO! " + CString(buf));
        }
    }
    return CDialog::OnCommand(wParam, lParam);
}

运行结果:

源码下载

MFC 对话框中动态创建N级菜单以及响应事件的更多相关文章

  1. MFC对话框中使用CHtmlEditCtrl

    MFC对话框中使用CHtmlEditCtrl 感谢原帖作者: http://blog.csdn.net/tingya/article/details/2028172 我在VS2008校正了一些代码. ...

  2. MFC对话框中显示BMP,JPG图片

    //************************************ // 方法说明:    显示JPG和GIF.BMP图片 // 参数说明:    CDC * pDC           设 ...

  3. 在MFC对话框中添加状态栏

    如果我们想实现在MFC对话框中添加状态栏显示,如何例如分状态栏为两列,第一列显示鼠标的当前位置,第二列显示当前的时间,(如上图). 1. 首先,打开在资源视图的String Table并添加两个ID: ...

  4. MFC对话框中显示背景图片

    在MFC对话框中显示图片,四个步骤. 1.首先得在VC6.0或者VS2008(其他版本也是一样)中导入GDI文件.(网上下载:) GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换, ...

  5. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  6. WPF 中动态创建和删除控件

    原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName(" ...

  7. HTML中关于动态创建的标签无法绑定js事件的解决方法:.on()方法的 [.selector]

    在前端页面的时候,会经常遇到用JavaScript动态创建出来的Button按钮或其他标签无法使用点击事件的问题.如下代码,使用jquery在body中动态创建一个class为demo的Button按 ...

  8. jquery中动态新增的元素节点无法触发事件解决办法

    在使用jquery中动态新增的元素节点时会发现添加的事件是无法触发的,我们下面就为各位来详细的介绍此问题的解决办法. 比如做一个ajax读取留言列表的时候,每条留言后面有个回复按钮,class为“re ...

  9. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

随机推荐

  1. cocos2dx进阶学习之CCApplication

    继承关系 CCApplication-> CCApplicationProtocol 类主要成员变量 static CCApplication * sm_pSharedApplication; ...

  2. eclipse中build workspace的相关优化

    网上流传的各种的eclipse的调优的方法都大同小异,但是调优的基本上针对eclipse或者myclipse的本身,比如关掉validate和启动项,文件拼写,和自动构建等,调过之后,等个eclips ...

  3. WebView.destroy() called while still attached 的解决的方法

    能够如今webView的父组件中删除该webview,然后再Destroy parent.removeView(webView); 然后 webView.removeAllViews(); webVi ...

  4. 开源 免费 java CMS - FreeCMS1.9 职位管理

    项目地址:http://code.google.com/p/freecms/ 职位管理 管理职位,实现招聘功能. 1. 职位管理 从左側管理菜单点击职位管理进入. 2. 加入职位 在职位列表下方点击& ...

  5. DH11数字温湿度传感器

    DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...

  6. nginx 解决400 bad request 的方法

    nginx的400错误比较难查找原因,因为此错误并不是每次都会出现的,另外,出现错误的时候,通常在浏览器和日志里看不到任何有关提示. 经长时间观察和大量试验查明,此乃request header过大所 ...

  7. SignalR系列教程:服务器广播与主动数据推送

    本篇是本系列入门篇的最后一遍,由于工作关系,接触SignalR的时间不是很多.等下次有空的话我会写一个利用“SignalR”开发一个在线聊天室的系列博文.近期的话我更偏向于更新框架设计相关的文章,到时 ...

  8. SignalR系列教程:在MVC5中使用SignalR

    本章主要内容: 1:向MVC5添加SignaIr 2: 什么是集线器,如何创建集线器 3: 客户端通过jqery调用集线器 本文还是延续“SignaIR快速入门”中聊天室的例子进行讲解.首先我们通过V ...

  9. Windows Store Javascript项目使用高德地图、谷歌地图、百度地图API

    原文 Windows Store Javascript项目使用高德地图.谷歌地图.百度地图API 在Win8 Store 项目中可以使用的地图主要有微软的Bing Map,目前高德地图sdk也支持Wi ...

  10. servlet的filter的使用

    一.概述 过滤器是servlet的一个重要特性,它提供一种机制,允许在过滤器中,即可以修改浏览器的请求信息,也可以对服务器处理后的响应信息进行修改. 一个过滤器是一个实现了Filter接口的java类 ...