基于对话框程序设计无法响应菜单更新命令的解决办法
来源:互联网 发布:软件行业分析 编辑:程序博客网 时间:2024/05/21 22:40
对话框程序默认不处理菜单资源的更新命令,即CXXXDlg::OnUpdateXXX(CCmdUI *pCmdUI)里面调用pCmdUI->SetCheck()无效,pCmdUI->Enable(FALSE)无法使菜单显示为灰色等等...
解决方案:
重载WM_INITMENUPOPUP消息的响应函数OnInitMenuPopup,在里面添加如下代码:
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; }
- 基于对话框程序设计无法响应菜单更新命令的解决办法
- 对话框程序无法响应菜单更新的问题
- 使基于对话框的菜单能够使用ON_UPDATE_COMMAND_UI更新菜单
- 基于对话框文档中使用菜单&弹出右键菜单时,无法更新菜单显示
- 给对话框添加菜单栏和状态栏,在状态栏显示菜单提示。并响应菜单更新命令
- 基于对话框程序用ON_UPDATE_COMMAND_UI更新菜单
- vc菜单 命令及更新 响应
- 菜单命令的消息响应
- 对话框命令更新怎样先于对话框显示菜单项
- S60中为对话框添加菜单及响应命令的方法(ZT)
- 基于对话框的UPDATE_COMMAND_UI的响应问题
- 基于对话框的UPDATE_COMMAND_UI的响应问题
- 基于MFC对话框的键盘消息响应
- 【MFC】基于对话框的键盘响应
- 【MFC】基于对话框的键盘响应
- 基于对话框应用程序中菜单更新问题处理
- windows无法更新的解决办法
- 基于对话框的MFC - 添加菜单
- fedora 开放环境搭建
- 不用软件直接查询QQ好友的IP地址(二) && 通过 Ping 得知对方是否联网在线(与QQ是否上线无关)
- test
- 计算机科学中最重要的32个算法
- G4Studio平台下基于ExtJS的下拉复选组件实现案例
- 基于对话框程序设计无法响应菜单更新命令的解决办法
- 顺序容器:顺序容器的操作
- 一次百度0.1元年费VIP的购买体验
- 2012年 中国MCU市场排名
- 练习2.5
- 对Java的一个简单思考
- C++编程,数据结构,算法类面试题集(1)
- C++编程,数据结构,算法类面试题集.(2)
- C++编程,数据结构,算法类面试题集.(3)