GetMenu()->GetSubMenu(0) 致使程序崩溃的解决方法

如果我们使用孙鑫的《VC++ 深入详解》,学到菜单这一章,就可以发现有这样一段程序。

int CMainFrame::OnCreate(LPCREATESTRUCT)  函数中有下面这句:
GetMenu() -> GetSubMenu(0) -> CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);

语句的功能是设置 【文件】菜单下【新建】菜单项前面的复选标志。

在 VS2010 中编译此程序,完全没有问题。但一点执行,程序立即崩溃。为什么会崩溃呢?

查看错误消息可以发现 GetMenu() 返回的是空指针,即 NULL == GetMenu()。

上网查了许多资料,都说是VS2010的机制改变了。

解决办法有两种:
一、创建项目时改变
在创建项目时,选择“经典样式”菜单,而不采用 VS2010 的新式菜单。这样菜单的操作就和在 VC++6.0 一样。
二、运用菜单的 UPDATE_COMMAND_UI 消息(我从《Visual C++ 2010 入门经典》当中找到的)

GetMenu()-GetSubMenu(0) 致使程序崩溃的解决方法 - Mugen_Masuta - Mugen_Masuta
 
其实菜单有两个消息,正如上面所说。我们来看看这种机制怎么运用。

GetMenu()-GetSubMenu(0) 致使程序崩溃的解决方法 - Mugen_Masuta - Mugen_Masuta

在为菜单添加消息处理函数时,看到右边有两种消息,下面那个消息我们平时都忽略了 = 。=

在添加完处理程序后就可以编写如下代码:

GetMenu()-GetSubMenu(0) 致使程序崩溃的解决方法 - Mugen_Masuta - Mugen_Masuta
 
如果有多个菜单需要设置,只需要将他们的消息处理函数设置成一样的就可以了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值