MFC学习之菜单栏创建

来源:互联网 发布:mac 10.12 降级 编辑:程序博客网 时间:2024/05/20 02:51

在开始学习MFC创建菜单时,根据书上的例子先在资源文件里建立好菜单,然后在代码中将菜单加载出来,其代码如下
`int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码CMenu menu;menu.LoadMenuA(IDR_MENU1);SetMenu(&menu);menu.Detach();return CFrameWnd::OnCreate(lpCreateStruct);return 0;

}`
当运行程序时,菜单已经建立
如图所示
当点击菜单项的时,没有弹出子菜单,而是产生中断
如下图所示
经过查阅资料和MSDN上的介绍原来是没有调用CMenu::Detach()
产生中断的原因是menu 是我在OnCreate中定义的一个局部对象,当OnCreate函数执行完成之后会自动调用CMenu的析构函数,进行资源的释放,在析构函数中,调用了Destroy函数,代码如下

BOOL CMenu::DestroyMenu(){    if (m_hMenu == NULL)        return FALSE;    return ::DestroyMenu(Detach());}从代码可以看出来,如果在OnCreate结束前没有释放menu句柄,会调用WIN32API函数::DestroyMenu(Detach));继续单步调试进入这个函数

如图所示
会自己调用Detach函数将menu对象与菜单句柄分离,然后才将menu对象销毁,当在OnCreate函数返回之前加入menu.Detach函数时,再次运行程序,点击菜单项不会中断,如图所示
这里写图片描述
虽然问题得到了解决,也大致明白了为什么会产生中断,但是心中却多了个疑问,因为从调试步骤看,虽然自己没有调用Detach函数,但是在menu对象析构的过程中,系统调用了Detach函数,感觉跟自己手动调用的效果不应该有区别,为什么会一个报错一个正常呢,肯定是还有那个地方没有弄清楚
ps:再次跟断点在析构函数里进入DestroyMenu(Detach))函数时发现此时menu对象未定义,是否是已经被释放了,如果是的那就正面后面调用的Detach函数没有起到作用
这里写图片描述

0 0
原创粉丝点击