vc++新手问题!对vs2010和vc6.0区别懂得进

今天在学习孙鑫vc++,出现了莫名奇怪的问题,
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
/////////////////
GetMenu()->GetSubMenu(0)->EnableMenuItem(0,MF_BYPOSITION|MF_CHECKED);
return 0;
}
这段代码是给一个窗口的第一个子菜单下的第一个菜单项标记√。可是我调试时出现了这个问题:菜单.exe 中的 0x5115a12c (mfc100ud.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突。这把我弄懵了,望大神们替我解决啊!万分感激!
忘了,我用的是vs2010,孙鑫用的是vc6.0

第1个回答  2012-01-28
由于OnCreate一般是在创建窗口的时候用的,你在调用GetMenu()->GetSubMenu(0)->EnableMenuItem(0,MF_BYPOSITION|MF_CHECKED);的时候,菜单对象还没有被创建。所以,在此设定菜单项的选定状态并不妥(由于菜单对象的指针为NULL)。
最妥的实现方式是:
ON_COMMAND(ID_VIEW_TASKPANE, &CMainFrame::OnViewTaskpane)

void CMainFrame::OnUpdateViewTaskpane(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck( m_wndTaskPane.IsVisible() );
}
第2个回答  2012-01-27
代码本身没什么问题 代码重新生成下 或者把DEBUG文件夹删掉重新生成试试看 这个跟VS VC6.0没什么关系
GetMenu()->GetSubMenu(0)->CheckMenuItem(1,MF_BYPOSITION|MF_CHECKED); //选中菜单
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,MF_BYPOSITION); //默认菜单本回答被网友采纳
第3个回答  2012-01-27
你可以查看堆栈(视图窗口中有堆栈窗口) 来看看代码停留在哪个函数里面比如是停留在 GetMenu() 中 还是 GetSubMenu(0) 中.
根据经验你这个可能是 GetMenu()->GetSubMenu(0) 返回的数据是 NULL ,也就是没有子菜单,但是你没有检查 就去EnableMenuItem 了追问

我看了堆栈,第一行是“mfc100ud.dll!CMenu::GetSubMenu(int nPos) 行 958 + 0xc 字节”,并且黄箭头指在afxwin1.inl文件的_“AFXWIN_INLINE CMenu* CMenu::GetSubMenu(int nPos) const
{ ASSERT(::IsMenu(m_hMenu)); return CMenu::FromHandle(::GetSubMenu(m_hMenu, nPos)); }”
刚学vc,真是弄不明白这些,请大虾在详细点告诉我,我该怎么改代码,才能不出错。

第4个回答  2012-01-27
楼上说的是,你的菜单设计有问题,这个错误表示函数没有找到你想找的子菜单,你可以在加一层子菜单试试,我说的没错的话这个错误就不会出现了。
相似回答