这里说的是SDI的情况,如果在vs2010里面按着默认选项创建一个单文档工程,
然后想做一件事情 ,就是把一个默认的子菜单的一项钩选,
代码如下 :
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);
程序就可以顺利通过了。
- 上一篇:常用的简单sql语句
-
10楼
wtsos1916 2013-01-23 13:33发表
- 这个方法治标不治本啊,求更好的解决方法
-
9楼
shengyingyo 2013-01-03 10:35发表
- 需要打印功能怎么办呢?
-
8楼
yuanfang071100641 2012-10-04 11:31发表
- 能找出这种问题的解决办法,了不得呀!
-
7楼
xin_cainiao 2012-08-02 00:10发表
- 太感谢了。找了半天才看到一个有用的。
-
6楼
tangongxue 2012-05-31 13:44发表
- 如果工程已创建好了,怎么修改这个属性呢?
-
5楼
xiashuuknow 2012-04-30 11:05发表
- 正需要呢
-
4楼
fengqifly 2012-04-07 16:37发表
- 谢谢你的文章!
-
3楼
xshalk 2011-12-21 16:37发表
- 多谢
-
2楼
ga6840 2011-07-23 20:45发表
- 谢谢你的这篇文章!!
-
1楼
warren258 2011-04-28 12:16发表
- 我想知道如果那个打印功能我想要要怎么处理?