`
yinxuesong
  • 浏览: 6581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MFC在对话框中响应ON_UPDATE_COMMAND_UI事件

阅读更多
原文出处:http://support.microsoft.com/kb/242577/zh-cn
如果菜单附加到 VisualC++ 中一个对话框则不能从其命令用户界面处理更改菜单项的状态,
使用以下步骤来解决此问题:

1. ON_WM_INITMENUPOPUP 条目添加到消息映射:

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//}}AFX_MSG_MAP

ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()

2. 将 OnInitMenuPopup 成员函数添加到对话框类并复制以下代码 (注意, 此代码取自 WinFrm.cpp 中 CFrameWnd::OnInitMenuPopup 主要):

CTestDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
{
    ASSERT(pPopupMenu != NULL);
    // Check the enabled state of various menu items.

    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;
    }
}
分享到:
评论

相关推荐

    MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息.docx

    MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息

    在MFC对话框程序中使用工具栏(工具条)和菜单栏

    本例在实现了在MFC对话框中使用工具栏(工具...并能较好响应ON_UPDATE_COMMAND_UI消息.同时能在响应函数中用SetCheck和Enable有效.里面也有能同时改变菜单ID相关联的工具栏按钮状态的能力,只是方法和在CMainFrame中不同.

    Visual_C++_6.0_MFC_入门

    MAP2.2 在窗口中输出文字.2.3 使用点、刷子、笔进行绘2.4 在窗口中绘制设备相关位图、图标、设备无关位图CDC memDC;//定义一个兼容DC2.5 使用各种映射方式2.6 多边形和剪贴区域3.1 文档视图框架窗口间的关系和消息...

    UPDATE.rar

    使得UPDATE_COMMAND_UI在基于对话框中生效 具体说明在 http://blog.csdn.net/mjesse88/article/details/17527723或者在程序的右键后说明可以直接进入该页面

    常用MFC和API函数

    CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本...

    部分MFC和API函数

    CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本功能...

    C++MFC教程

    |------ 5.5 在对话框中进行数据交换和数据检查 |------ 5.6 使用属性对话框 |------ 5.7 使用通用对话框 |------ 5.8 建立以对话框为基础的应用 |------ 5.9 使用对话框作为子窗口 +-- 第六章 网络通信开发 |------...

    深入浅出MFC【侯捷】

    对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 View功能的加强与重绘效率的提高 同时修改多个Views:UpdateAllViews和OnUpdate 在View中定义一个hint 把hint传给OnUpdate ...

    深入浅出MFC 2e

    维护UI对象状态(UPDATE_COMMAND_UI) 本章回顾 第10章 MFC与对话盒 对话框编辑器 利用ClassWizard连接对话框与其专用类 对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 ...

    侯捷- -深入浅出MFC

    维护UI对象状态(UPDATE_COMMAND_UI) 本章回顾 第10章 MFC与对话盒 对话框编辑器 利用ClassWizard连接对话框与其专用类 对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 ...

    MFC教程入门知识全集.rar

    6.1.2.5 给菜单项添加UPDATE_COMMAND_UI 消息处理 6.1.2.6 一个简单的绘图程序 6.1.3 在应用程序中控制菜单 6.1.3.1 在应用程序中取得菜单 6.1.3.2 在应用程序中修改菜单的状态 6.1.3.3 在应用程序中添加、删除...

    Visual C++ 编程资源大全(英文源码 表单)

    UPDATE_COMMAND_UI with dialogs 在对话框中使用ON_UPDATE_COMMAND_UI(13KB)&lt;END&gt;&lt;br&gt;13,13.zip Using ON_UPDATE_COMMAND_UI with dialogs (2) 使用ON_UPDATE_COMMAND_UI(11KB)&lt;END&gt;&lt;br&gt;14,14.zip ...

    深入浅出mfc简体中文版

    維護 UI 物件狀態(UPDATE_COMMAND_UI) / 594 本章回顧/ 599 第10 章 MFC 與對話盒/ 601 對話盒編輯器/ 602 利用 ClassWizard 連接對話盒與其專屬類別/ 606 PENDLG.H / 610 PENDLG.CPP / 610 對話盒的訊息處理函式/...

    手机图片浏览器

    ON_UPDATE_COMMAND_UI(IDC_FILE_SAVE, OnUpdateFileSave) ON_CBN_SELCHANGE(IDC_PICTYPE, OnSelchangePictype) ON_WM_TIMER() ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1) ON_EN_CHANGE(IDC_ADDRESS, ...

    使菜单项和工具条按钮灰掉、菜单项打勾的实现代码.rar

    SDK与MFC两套代码实现 使菜单和工具条按钮灰掉及打勾的不同实现 MFC心跳按钮与UpdateCommandUI的实现

    8-07-14_MegaCLI for linux_windows

    LSIP200232954 (DFCT) Need to Support all the MFC default values in the command AdpSettings. LSIP200245968 (DFCT) In EFICLI not able to flash latest firmware to controller without using -nosigchk -...

    Visual C++ 编程资源大全(英文控件)

    24.zip Moving and Resizing the Property Pages 移动并改变属性页大小(3KB)&lt;END&gt;&lt;br&gt;20,27.zip Using ON_UPDATE_COMMAND_UI in Property Pages 在属性页中使用ON_UPDATE_COMMAND_UI(2KB)&lt;END&gt;&lt;br&gt;22,...

    stdafx.h代码

    // CommandLine parsing helper class CDocManager; // CDocTemplate manager object ///////////////////////////////////////////////////////////////////////////// // Type modifier for message handlers...

Global site tag (gtag.js) - Google Analytics