MFC 对话框中动态创建N级菜单以及响应事件

创建一个基于对话框的工程,工程名为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);
}

 

 

 

运行结果:

 

源码下载

时间: 2024-09-04 00:00:27

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

MFC里让动态创建的ActiveX控件响应Windows消息

碰到的问题:      我在MFC程序中使用一个由CWnd::CreateControl 创建的WebBrowser控件,这个控件是有CWnd继承下来的,今天我有一个需求是要在当中响应Windows消息去重绘,但是我发现这个控件窗口居然不能够接受父窗口的Windows窗口消息,很是无语. 问题产生的原因:      导致控件无法接收Windows窗口消息的原因是因为CreateControl 没有子类化子窗口,自然是无法响应了.关于子类化的相关资料请查看参考资料,或者自行搜索. 解决的办法:  

急!如何在对话框中动态创建多个编辑框!

问题描述 我想做一个5x5的数组输入区域,由25个编辑框对应数组输入,请教各位如何动态的创建这25个编辑框,并且用一个数组变量关联起这25个编辑框作为各个编辑框的成员变量,这个问题困扰我好几天了,请各位帮帮忙,在下不胜感谢!!!! 解决方案 解决方案二:可以用split在一个编辑框里输入要输入的所有字串,不同的内容用一个符号隔开,比如".",然后把这个编辑框的内容给一个数组string[]a=newstring[25];a=s.Split('.');解决方案三:感谢1楼的,我的意思你没

如何在MFC对话框程序中动态创建一个单文档。

问题描述 如何在MFC对话框程序中动态创建一个单文档. 就是在MFC对话框程序里单击一个按钮可以出现一个单文档界面,是MFC对话框的框架 解决方案 再做一个单文档的exe,点击按钮,启动它

MFC中动态创建控件以及事件响应实现方法_C 语言

本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()

MFC对话框中添加状态栏的方法_C 语言

本文实例讲述了MFC对话框中添加状态栏的方法.分享给大家供大家参考.具体如下: 1.在对话框的dlg实现类里添加成员变量: CXTPStatusBar m_wndStatusBar; //状态栏(或者是CStatusBar) //在OnInitDialog方法中初始化: static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICA

在VB中动态创建数据库

在VB中动态创建数据库新建工程.添加控件 对应写上代码 以下为引用的内容:Private Sub Command2_Click()    Dim myDB As DAO.Database    'Set myDB = DAO.OpenDatabase("d:\mydb3.mdb")    Set myDB = DAO.OpenDatabase(App.Path + "/mydb.mdb")    Dim d As String    d = "delete

在存储过程中动态创建表

在尝试做在线考试系统的过程中,为了管理每个学生的考试信息,就考虑为每个学生创建以学号命名的临时数据表. 在存储过程中动态创建表如果不使用参数的话很好创建.方法如下: ALTER procedure [dbo].[ZXKS_GETSCORE] AS begin transaction --创建临时表,直接命名 create table temp_tablename ( id int primary key, da varchar(300), fs int ) declare @count int

MFC对话框中的图标怎么编辑?可不可以使用下载的BMP的图标?

问题描述 MFC对话框中的图标怎么编辑?可不可以使用下载的BMP的图标? 谢谢,如题,MFC对话框中的图标怎么编辑?可不可以使用下载的BMP的图标? 解决方案 推荐你使用Axialis IconWorkshop,它功能比VC++自带的强很多. 解决方案二: 不可以,需要先转换成ico,有网站提供在线转换,也可以用一些软件转换

MFC对话框中滚动条相互影响

问题描述 MFC对话框中滚动条相互影响 我点第二个滚动条,原先设置好的与第一个滚动条关联好的编辑框的数字就变了,请问怎么解决??新手上路,大家帮帮忙 解决方案 要看你编辑框是如何关联滚动条的.