在对话框程序中操作菜单项
来源:互联网 发布:ubuntu 自带虚拟机 编辑:程序博客网 时间:2024/05/22 21:13
在做基于对话框的程序时,有时我们要在这个对话框中加载菜单,于是可能要在对话框程序代码中修改菜单荐的状态或操作菜单项的其它操作,可是当我们用代码操作菜单项时:
GetMenu()->GetSubMenu(0)->EnableMenuItem(ID_ISP_DISPLAYMEMORY,MF_BYCOMMAND | MF_ENABLED);
编译时没什么问题,运行时,程序直接崩溃.该怎么解决这个问题呢?
在网上搜了很多资料,大部分都是说在得在框架类的构造函数内如下修改:
CMainFrm::CMainFrm { // Other stuff this->m_bAutoMenuEnable = true; }
即改为"true"就可以了.
可是哥写的是对话框程序!!! 哪来的构架类????
这个问题该怎么解决呢?? 经过坚持不懈的查找,终于找到了解决方法:
第一步: 为对话框类 添加WM_INITMENUPOPUP消息.
方法: 在对话框类的属性面板上方点一下那个Message按扭, 在消息列表中找到WM_INITMENUPOPUP,并添加此消息处理函数.
第二步: 在WM_INITMENUPOPUP消息处理函数内添加如下代码:
void CLPC1114UpdaterDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu){CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);// TODO: Add your message handler code hereASSERT(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;}}
ok,接下来就可以用
GetMenu()->GetSubMenu(0)->EnableMenuItem(ID_ISP_DISPLAYMEMORY,MF_BYCOMMAND | MF_ENABLED);
这个函数来设置菜单项的状态了.
参考:http://support.microsoft.com/default.aspx?scid=kb;en-us;242577
- 在对话框程序中操作菜单项
- 在对话框程序中创建并且加载菜单资源
- 在对话框中添加菜单
- 在GameObject菜单下面第一级建立菜单项,并且在Hierarchy对话框中显示出来
- 如果该菜单附加到一个对话框,在 Visual c + + 中则不能从其命令用户界面处理程序更改的菜单项的状态
- 在Ubuntu应用程序菜单中自行增加程序菜单项
- 在对话框中使用ON_UPDATE_COMMAND_UI更新菜单
- 在MFC对话框中添加菜单
- 在对话框中使用ON_UPDATE_COMMAND_UI更新菜单
- VC 在对话框中增加菜单
- 在MFC(VS2013)对话框中添加菜单
- 如何在一个基于对话框的程序中添加 Menu 菜单
- 在对话框中创建菜单以及快捷菜单的步骤
- MFC 基于对话框程序添加菜单项
- 对话框的菜单操作
- WinCE中为基于对话框的程序动态增加菜单
- VS2010环境下用c++语言在MFC对话框程序中连接及操作Mysql 数据库
- 如何在vba中操作快捷键 & 添加菜单项
- Linux php的运行模式与其相关名词术语
- WCF配置文件注释
- SGU105
- ascii tool - Ascii Art Studio
- 七种场景下的软件工作量估算步骤
- 在对话框程序中操作菜单项
- C#之咿呀学语(1)
- 一、UML基本概念
- 非官方的python模块下载地址
- 从零开始学算法:十种排序算法介绍(中)
- 系统讲解UIView
- 维度表 事实表
- 初学sencha-touch1.1-mvc教程3篇
- 观察者模式——依赖倒置