关于MFC CMenu局部变量消失菜单还存在的问题

在CMainFrame的OnCreate()函数中有这么一段代码:OnCreate(){。。。。CMenumenu;/*SetMenu(NULL);CMenumenu;m... 在CMainFrame的OnCreate()函数中有这么一段代码 :
OnCreate()
{
。。。。
CMenu menu;
/*SetMenu(NULL);
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);*/
}

注意我在最后并没有调用Detach(),根据MSDN的官方解释,由于menu是局部变量,函数结束后对象销毁,对应的资源也销毁,但是为什么窗口上的菜单还存在呢?有哪位能解释一下啊,我实在是想不明白,谢谢~~~
展开
 我来答
倨孔鞍吞低寡N
2013-08-20 · 超过10用户采纳过TA的回答
知道答主
回答量:24
采纳率:0%
帮助的人:30.4万
展开全部
这个问题乍一看MSDN还真是找不到,下面我替楼主分析这个问题哈:

首先看这个:
_AFXWIN_INLINE CMenu::~CMenu()
{ DestroyMenu(); }
什么意思呢?看到了吧菜单是这么来把自己消掉的,再看下面:

BOOL CMenu::DestroyMenu()
{
if (m_hMenu == NULL)
return FALSE;
return ::DestroyMenu(Detach());
}

这是什么呢?如果我们Detach过了就结束,没呢就再Detach一遍,其实这不是重点,呵呵,主要是Detach()返回的句柄:

HMENU CMenu::Detach()
{
HMENU hMenu;
if ((hMenu = m_hMenu) != NULL)
{
CHandleMap* pMap = afxMapHMENU(); // don't create if not exist
if (pMap != NULL)
pMap->RemoveHandle(m_hMenu);
}
m_hMenu = NULL;
return hMenu;
}

MFC里面会为每个资源句柄建立一个映射表,这里是一样的,从表里要删除(看源码少的可以略去~~)他把已经分离的句柄又返回了,总的来说他还是要销毁我们辛苦创建的菜单(妹的这么绕~~):

::DestroyMenu(Detach());这句就有内涵了,哈哈;看MSDN。

重点:
Before closing, an application must use the DestroyMenu function to
destroy a menu not assigned to a window. A menu that is assigned to a window is
automatically destroyed when the application closes.

也就是说没有被设置窗口的的菜单会被销毁,被设置窗口的菜单会在应用程序关闭时自动销毁。
楼主明白不!
大雅新科技有限公司
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,... 点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式