如果我们使用孙鑫的《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 入门经典》当中找到的)
二、运用菜单的 UPDATE_COMMAND_UI 消息(我从《Visual C++ 2010 入门经典》当中找到的)
其实菜单有两个消息,正如上面所说。我们来看看这种机制怎么运用。
在为菜单添加消息处理函数时,看到右边有两种消息,下面那个消息我们平时都忽略了 = 。=
在添加完处理程序后就可以编写如下代码:
如果有多个菜单需要设置,只需要将他们的消息处理函数设置成一样的就可以了。