VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法

6 篇文章 0 订阅

    问题:今天学习《Visual C++ 开发权威指南,尹成》P119,使用VS2010,MFC,单文档应用程序中标记菜单添加代码后程序中断!!!


参考链接:点击打开链接

    代码如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
............................
	CMFCToolBar::SetBasicCommands(lstBasicCommands);
	GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);

	return 0;
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);
	GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN,FALSE);
	GetMenu()->GetSubMenu(0)->SetDefaultItem(4,TRUE);

	m_bitmap.LoadBitmap(IDB_SORT_24);
	GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);

	return 0;
}

但是运行之后中断,如下图:



网上查了下,说VS2010建的SDI/MDI与之前的不一样,是类似BCG的一些东西,所以用之前的方法GetMenu()得到CMenu是NULL或者无效。


<解决方案>

     在CMainFrame类中找到CMFCMenuBar m_wndMenuBar;这个成员变量,将跟它相关的代码注释掉的话,然后运行,OK。


方法二:


<说明>我的VS2010安装的可能有问题“在新建的工程项目中对话框选择不了原始的菜单模式


<解决方法>

使用最原始的Menu格式,就在新建的项目工程的对话框中选择回原始的菜单模式即可,如下图



<注意>  经过更改后编译会出现两个错误,是关于:

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

两句代码是关于打印功能的。如果不涉及这方面的功能,可以直接把这两句话注释掉。(也可以在创建项目时把“打印预览”去掉)

然后在CMainFrame::OnCreate()末尾加上GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);
程序就可以顺利通过了。


<思考>在VS2010的菜单的相关编程中,关于Getmenu()和GetSubMenu的相关异常是否都可以这样处理!

<例如>  MFC中单文档应用程序动态添加菜单,代码如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
CMenu m_Menu;
m_Menu.CreatePopupMenu();
ASSERT(m_Menu.GetSafeHmenu());
GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_Menu.m_hMenu,_T("文件"));
m_Menu.AppendMenuW(MF_STRING,111,_T("新建"));
m_Menu.AppendMenuW(MF_STRING,112,_T("打开"));
m_Menu.Detach();
return 0;
}

<解决方案>用上述的两种方法都可

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值