以对话框为父窗口创建的菜单,菜单响应函数可以写在对话框类中。
菜单响应函数的映射和普通菜单响应映射一样。
但是菜单状态更新命令,需要特殊处理。

BEGIN_MESSAGE_MAP(CDlg, CDialogEx)
    ON_WM_INITMENU()
    ON_WM_INITMENUPOPUP()
    // 大气象
    ON_UPDATE_COMMAND_UI_RANGE(1001,1002,&OnMenuItemUI)
END_MESSAGE_MAP()

// 设置Check或Enable
void CDlg::OnMenuItemUI(CCmdUI *pCmdUI)
{
    if (pCmdUI->m_nID == 1001)
    {
        pCmdUI->SetCheck(1);
    }
    if (pCmdUI->m_nID == 1002)
    {
        pCmdUI->Enable(FALSE);
    }
}

BOOL CDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化
    CMenu menuMain;
    menuMain.CreateMenu();

CMenu menuChild;
    menuChild.CreatePopupMenu();
    menuChild.AppendMenu(MF_STRING,1001,"menu1");
    menuChild.AppendMenu(MF_STRING,1002,"menu2");

menuMain.AppendMenu(MF_POPUP,(UINT)menuChild.Detach(),"menu0");

SetMenu(&menuMain);
    menuMain.Detach();

return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE
}
// 大气象:需要在这里做特殊处理。
void CDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
    CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

// TODO: 在此处添加消息处理程序代码
    CCmdUI state; 
    state.m_pMenu = pPopupMenu; 
    ASSERT(state.m_pOther == NULL); 
    ASSERT(state.m_pParentMenu == NULL);

// Determine if menu is popup in top-level menu and set m_pOther to 
    // it if so (m_pParentMenu == NULL indicates that it is secondary popup). 
    HMENU hParentMenu; 
    if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu) 
        state.m_pParentMenu = pPopupMenu;    // Parent == child for tracking popup. 
    else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL) 
    { 
        CWnd* pParent = this; 
        // Child windows don't have menus--need to go to the top! 
        if (pParent != NULL && 
            (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL) 
        { 
            int nIndexMax = ::GetMenuItemCount(hParentMenu); 
            for (int nIndex = 0; nIndex < nIndexMax; nIndex++) 
            { 
                if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu) 
                { 
                    // When popup is found, m_pParentMenu is containing menu. 
                    state.m_pParentMenu = CMenu::FromHandle(hParentMenu); 
                    break; 
                } 
            } 
        } 
    }

state.m_nIndexMax = pPopupMenu->GetMenuItemCount(); 
    for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; 
        state.m_nIndex++) 
    { 
        state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex); 
        if (state.m_nID == 0) 
            continue; // Menu separator or invalid cmd - ignore it.

ASSERT(state.m_pOther == NULL); 
        ASSERT(state.m_pMenu != NULL); 
        if (state.m_nID == (UINT)-1) 
        { 
            // Possibly a popup menu, route to first item of that popup. 
            state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex); 
            if (state.m_pSubMenu == NULL || 
                (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || 
                state.m_nID == (UINT)-1) 
            { 
                continue;       // First item of popup can't be routed to. 
            } 
            state.DoUpdate(this, TRUE);   // Popups are never auto disabled. 
        } 
        else 
        { 
            // Normal menu item. 
            // Auto enable/disable if frame window has m_bAutoMenuEnable 
            // set and command is _not_ a system command. 
            state.m_pSubMenu = NULL; 
            state.DoUpdate(this, FALSE); 
        }

// Adjust for menu deletions and additions. 
        UINT nCount = pPopupMenu->GetMenuItemCount(); 
        if (nCount < state.m_nIndexMax) 
        { 
            state.m_nIndex -= (state.m_nIndexMax - nCount); 
            while (state.m_nIndex < nCount && 
                pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID) 
            { 
                state.m_nIndex++; 
            } 
        } 
        state.m_nIndexMax = nCount; 
    } 
}
// 大气象:注意不是这里
void CDlg::OnInitMenu(CMenu* pMenu)
{
    CDialogEx::OnInitMenu(pMenu);

// TODO: 在此处添加消息处理程序代码
}


对话框里创建的菜单,响应函数可以写在其他类。
需要源码的,留下邮箱索取。
url:http://greatverve.cnblogs.com/archive/2012/11/28/dlg-on-update-command-ui.html 
参考:
http://support.microsoft.com/kb/242577/zh-cn
http://greatverve.cnblogs.com/archive/2012/11/21/mfc-dlg-menu-cmd.html

    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/greatverve/archive/2012/11/28/dlg-on-update-command-ui.html,如需转载请自行联系原作者

MFC对话框响应ON_UPDATE_COMMAND_UI事件相关推荐

  1. MFC中,多个Button响应同一个事件

    问题:有10个Button,如何让他们响应同一个事件函数,并且知道是哪个Button触发的 解决方法: 1.让十个Button的资源号连续 2.Dlg.h中添加代码: void   OnButtonC ...

  2. MFC对话框动态刷新图片(仿照全屏屏保)

    最近做MFC对话框工程 用到全屏刷新图片的功能,由于功能实现比较简单,便使用CImage类配合定时器制作,下面贴上实现方式: 增加消息响应事件: //在对话框属性的消息中 添加WM_PAINT与WM_ ...

  3. 计算机自带的科学计算器代码,[置顶] 科学计算器(简化版:基于MFC对话框)

    科学计算器(简化版) 最终界面: 全部源代码下载地址: 链接: http://download.csdn.net/detail/u012339743/8198227 详细编写过程: 1.    打开V ...

  4. c语言windows程序设计 - 第十天,C语言Windows程序设计 - 第十天 - 响应键盘事件...

    响应键盘事件 ------------------------ 在开始学习有关键盘事件的知识前首先来看一段代码(回调函数这部分的代码): 1 LRESULT CALLBACK WndProc( HWN ...

  5. MFC对话框中的工具栏、状态栏设计小结

    对网上的资料结合自己的实践的总结,由于大部分都是网上先辈们的经验,这里只是直接将内容拿来,格式优化一下更易读而已. 对话框中建立工具栏的方法 工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标 ...

  6. CEF:MFC 对话框 Demo(VS2013)

    原文链接:https://blog.csdn.net/blackwoodcliff/article/details/74276848 随着 HTML5 的崛起和 IE 的淘汰,微软 Web Brows ...

  7. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

    用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/5 ...

  8. MFC对话框应用程序中谷歌CEF浏览器内核的使用

    MFC对话框应用程序中谷歌CEF浏览器内核的使用 最近在做一个与浏览器相关的MFC项目,用户要求使用IE和谷歌双内核.对于IE内核可以直接使用MFC中的ACTIVEX控件,但是对于谷歌浏览器内核却并没 ...

  9. MFC 对话框背景图片

    在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现.今天我们来说一下如何用MFC美化对话框,默认情况下,对话框的背景如下 ...

最新文章

  1. RESTful 架构基础
  2. BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的
  3. DL之CNN:基于CNN-RNN(GRU,2)算法(keras+tensorflow)实现不定长文本识别
  4. VS2008工具,两种加入库的方法。 设置程序运行时目录
  5. Linux mysql 登录 2002,Linux 下 Mysql error 2002 错误解决
  6. 创建一个简单的WCF程序
  7. C#接口归纳总结实例详解
  8. CSS失效的问题总结(转:孟子E章)
  9. 计算机网络学习笔记:第二章
  10. c#winform窗口页面一打开就加载的方法
  11. linux 消息队列_Linux消息队列
  12. 使用xampp和tiki搭建内网wiki
  13. linux内存回收500M,回收和交换Linux的内存回收和交换
  14. golang:map转json字符串
  15. 全国计算机三级网络技术题库南开,计算机三级网络技术机题库_及答案(南开100题).doc...
  16. PowerBi包含什么,以及每一个的介绍
  17. 网络1712--c语言函数作业总结
  18. X86与ARM平台下的参数传递机制
  19. 量化金融投资及其python应用_量化投资:用Python实现金融数据的获取与整理
  20. python笔记本电脑推荐2020_最新版:2020年适合程序员的推荐笔记本电脑

热门文章

  1. python 元类的call_通过 python的 __call__ 函数与元类 实现单例模式
  2. 电脑的基础知识_电脑的基础知识大全,你确定都知道?
  3. oracle+查表物理块数,查询Oracle表实际物理使用大小
  4. mysql 安装导航_ubuntu下安装Mysql
  5. plsa的java实现_java在注解中绑定方法参数的解决方案
  6. signature=2d36ad490c0d9e19a6dc808d43a34033,Matemàtica discreta : problemes resolts
  7. mysql服务器的搭建_基于linux的Mysql服务器的搭建
  8. VB:谁终结了我的程序
  9. 机器学习算法太厉害,导致人类也通不过谷歌验证码
  10. 2018星际AI大赛冠军诞生!一个个机器学习算法,都输给不会学习的韩国bot