问题:今天学习《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;
}