原文出处: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消息
本例在实现了在MFC对话框中使用工具栏(工具...并能较好响应ON_UPDATE_COMMAND_UI消息.同时能在响应函数中用SetCheck和Enable有效.里面也有能同时改变菜单ID相关联的工具栏按钮状态的能力,只是方法和在CMainFrame中不同.
MAP2.2 在窗口中输出文字.2.3 使用点、刷子、笔进行绘2.4 在窗口中绘制设备相关位图、图标、设备无关位图CDC memDC;//定义一个兼容DC2.5 使用各种映射方式2.6 多边形和剪贴区域3.1 文档视图框架窗口间的关系和消息...
使得UPDATE_COMMAND_UI在基于对话框中生效 具体说明在 http://blog.csdn.net/mjesse88/article/details/17527723或者在程序的右键后说明可以直接进入该页面
CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本...
CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本功能...
|------ 5.5 在对话框中进行数据交换和数据检查 |------ 5.6 使用属性对话框 |------ 5.7 使用通用对话框 |------ 5.8 建立以对话框为基础的应用 |------ 5.9 使用对话框作为子窗口 +-- 第六章 网络通信开发 |------...
对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 View功能的加强与重绘效率的提高 同时修改多个Views:UpdateAllViews和OnUpdate 在View中定义一个hint 把hint传给OnUpdate ...
维护UI对象状态(UPDATE_COMMAND_UI) 本章回顾 第10章 MFC与对话盒 对话框编辑器 利用ClassWizard连接对话框与其专用类 对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 ...
维护UI对象状态(UPDATE_COMMAND_UI) 本章回顾 第10章 MFC与对话盒 对话框编辑器 利用ClassWizard连接对话框与其专用类 对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 ...
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 在应用程序中添加、删除...
UPDATE_COMMAND_UI with dialogs 在对话框中使用ON_UPDATE_COMMAND_UI(13KB)<END><br>13,13.zip Using ON_UPDATE_COMMAND_UI with dialogs (2) 使用ON_UPDATE_COMMAND_UI(11KB)<END><br>14,14.zip ...
維護 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, ...
SDK与MFC两套代码实现 使菜单和工具条按钮灰掉及打勾的不同实现 MFC心跳按钮与UpdateCommandUI的实现
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 -...
24.zip Moving and Resizing the Property Pages 移动并改变属性页大小(3KB)<END><br>20,27.zip Using ON_UPDATE_COMMAND_UI in Property Pages 在属性页中使用ON_UPDATE_COMMAND_UI(2KB)<END><br>22,...
// CommandLine parsing helper class CDocManager; // CDocTemplate manager object ///////////////////////////////////////////////////////////////////////////// // Type modifier for message handlers...