VS2010 MFC菜单插入的问题。。。。

CMainFrame::CMainFrame(){//TODO:在此添加成员初始化代码theApp.m_nAppLook=theApp.GetInt(_T("Applic... CMainFrame::CMainFrame()
{
// TODO: 在此添加成员初始化代码
theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
/*----------------------------------------------------------------------------*/ //1号位置
CMenu menu;
menu.CreatePopupMenu();
GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu, _T("WinSun")); //插入菜单
menu.AppendMenu(MF_STRING,111,_T("Hello")); //插入菜单项
menu.AppendMenu(MF_STRING,112,_T("Weixin"));
menu.AppendMenu(MF_STRING,113,_T("Mybole"));
menu.Detach();
/*---------------------------------------------------------------------------*/
BOOL bNameValid;
// 基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook);

if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1; // 未能创建
}
.............中间省略了部分程序自带代码
lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC);
lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE);
lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS);
lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE);

CMFCToolBar::SetBasicCommands(lstBasicCommands);
/*------------------------------------------------------------------*/// 2号位置
CMenu menu;
menu.CreatePopupMenu();
GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu, _T("WinSun")); //插入菜单
menu.AppendMenu(MF_STRING,111,_T("Hello")); //插入菜单项
menu.AppendMenu(MF_STRING,112,_T("Weixin"));
menu.AppendMenu(MF_STRING,113,_T("Mybole"));
menu.Detach();
/*------------------------------------------------------------------*/

return 0;
}
最近在学习MFC,看的孙鑫老师的MFC视频,在讲到菜单的添加与插入那节时。我添加的代码有2个位置,在上面的2条线之间的部分,其他的都是程序自带的代码。VS2010编译与VC6.0编译有出入,以上是我的MainFrame 的OnCreate()代码,程序代码添加在1号位置时,可以运行,但是如果把那段代码注释起来,运行结果与没注释一样,这让我很费解,注释起来后就相当于没代码了,为什么运行还会出现之前的结果呢?而且就算改了代码它的运行结果还是一样的。。;孙鑫老师写的代码是在2号位置的,但VS2010在2号位置编译会报错。
2号位置出错:

1号位置代码注释起来后,右边的窗口中的winsun还在!

小弟初学者,这个情况真心不知道是什么原因,还望大神多多指教
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏30(财富值+成长值)
jellycgl
2014-12-12 · TA获得超过417个赞
知道小有建树答主
回答量:1149
采纳率:66%
帮助的人:891万
展开全部
首先你要确定GetMenu()函数是否返回了正确的菜单指针,很有可能这个是野指针或者空指针,导致后面调用出错;
注释后需要确定重新编译了再运行,如果还出现一样的结果,只能证明是下面的代码 有问题,或者是你模仿的有问题,或者是他原来的代码有问题,计算机是不会骗人的。

这个需要你添加断点跟踪看才能准确的分析和定位问题,也是一种基本的能力
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
185*****324
2018-03-09
知道答主
回答量:1
采纳率:0%
帮助的人:892
展开全部
解决方案1:
在CMainFrame类中找到CMFCMenuBar m_wndMenuBar;这个成员变量,将跟它相关的代码注释掉的话,然后运行,OK。
解决方法2:
这里说的是SDI的情况,如果在vs2010里面按着默认选项创建一个单文档工程(Single Document).
问题分析:
出错的代码如下 :
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);
加在CMainFrame::Oncreate()里面,整个程序就会崩溃,出现的异常类似如此:Unhandled exception at 0x58aba12c (mfc100ud.dll) in menu1.exe: 0xC0000005: Access violation reading location 0x00000004.
出错的原因是,在执行这段代码的时候,Menu并没有生成。因为采用断点来检测的话,此时的GetMenu返回值不是一个正常的地址。为什么会这样呢?
后来才发现visual studio2010里默认采用的是Menu格式在OnCreate()末端并未生成。vs2010默认采用的是增加了扩展功能的Menu,所以调用GetMenu()会得到空指针。
解决方法:
最原始的解决方法是采用回原来的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);
程序就可以顺利通过了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友080cdba
2018-03-09
知道答主
回答量:1
采纳率:0%
帮助的人:892
展开全部
但是GetMenu()返回始终未NULL,无法获取菜单指针,网上查了下,说VS2010建的SDI/MDI与之前的不一样,是类似BCG的一些东西,所以用之前的方法GetMenu()得到CMenu是NULL或者无效。
【解决方案】:
在CMainFrame类中找到CMFCMenuBar m_wndMenuBar;这个成员变量,将跟它相关的代码注释掉的话,然后运行,OK。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式