当前位置:C++技术网 > 资讯 > VS2010的MFC菜单编程问题GetMenu

VS2010的MFC菜单编程问题GetMenu

更新时间:2016-02-26 16:18:16浏览次数:1+次

    今天按照书本编程,在MFC的框架类中对子菜单的菜单项添加复选标识,也就是加个勾,代码是

GetMenu()->GetSubMenu(0)->CheckMenuItem(2, MF_BYPOSITION | MF_CHECKED);
,运行时发现报错,错误如下图所示


        

,复查了书本很多遍,确定代码没有写错,那到底是什么问题。

    调试程序,发现程序跑到_AFXWIN_INLINE CMenu* CMenu::GetSubMenu(int nPos) const 
{ ASSERT(::IsMenu(m_hMenu)); return CMenu::FromHandle(::GetSubMenu(m_hMenu, nPos)); } 就出错了。

    查看m_hMenu的值,是空的,仔细一想,难道GetMenu函数获取的菜单对象失败?

    实在想不通,于是去百度了,有人说VS2010建的SDI/MDI与之前的不一样,是类似BCG的一些东西,所以用之前的方法GetMenu()得到CMenu是NULL或者无效。

    百度完我还是不怎么懂,基本理解是VS2010创建的MFC有比较高级的菜单,导致之前的方法GetMenu()不可用了,如果想继续使用GetMenu(),那么解决方法有两个:

    1、在CMainFrame类中找到m_wndMenuBar这个成员变量,将跟它相关的代码注释掉。


 /* if (!m_wndMenuBar.Create(this))     //注释
 {
  TRACE0("Failed to create menubar\n");
  return -1;      // fail to create
 }*/

/* DockPane(&m_wndMenuBar);*/  //注释


    2、在新建项目的时候,在应用程序向导中选择【MFC标准】以及【经典菜单】,如下图所示。

    

    

    如果大家知道更详细的问题根源,欢迎分享。