CMenu类的 detach()函数的不解,菜单句柄与菜单分离是什么意思呢?
--------------------------------------------- SetMenu(NULL); //移除菜单
CMenu menu; //局部菜单对象
menu.LoadMenu(IDR_MAINFRAME); //从一个资源加载菜单
SetMenu(&menu); //设置并显示菜单 menu.Detach(); //?????????以上代码,是vc++深入详解中的.
menu是局部对象.
书中说,由于 menu 是局部对象,所以最后必须加上 menu.Detach()方法.
目的是将菜单对象与菜单句柄分离.
我不明白,1.菜单句柄 与菜单对象不是 一个东西吗? 句柄不就是对象的一个标识吗?
2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?
--------------------------------------------- SetMenu(NULL); //移除菜单
CMenu menu; //局部菜单对象
menu.LoadMenu(IDR_MAINFRAME); //从一个资源加载菜单
SetMenu(&menu); //设置并显示菜单 menu.Detach(); //?????????以上代码,是vc++深入详解中的.
menu是局部对象.
书中说,由于 menu 是局部对象,所以最后必须加上 menu.Detach()方法.
目的是将菜单对象与菜单句柄分离.
我不明白,1.菜单句柄 与菜单对象不是 一个东西吗? 句柄不就是对象的一个标识吗?
2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?
解决方案 »
- 在线的等答复!!RTP利用全代理(Full Proxy方式) 能否穿越对成型(Symmetric) NAT??
- VS2003控件问题
- 本机的UDP数据是如何传输的?
- 怎么写一个ftp client(就像系统自带的),请各位大侠指教,谢谢。
- 怎样实现每隔1分钟弹出一个子对话框
- *********<<windows 程序设计>>上的源程序,编译通不过.怎么改??????(急!waiting...........)********************
- 如何显示汉字?
- 关于SEH的疑问??
- 奇怪的问题:记录集打开数据库,'操作符丢失',
- 如何在MFC中调用C文件里面的函数?
- 关于CComboBox的内存问题
- VS2008如何修复由于停电乱码的CPP文件?
hmenu资源是不是,永远也得不到销毁呀?
菜单对象不管他了,谁来管他呢?
===============
不是一个东西,菜单对象是一个C++类的对象,它只是CMenu类的一个对象,只有关联了一个菜单句柄之后才能真正的操作一个菜单。另外,“句柄不就是对象的一个标识吗?”这里的对象如果是指C++对象,那么这句话是错的。2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
==============
菜单是一个资源,而菜单句柄是这个资源的一个标识。其实这个还是第一个问题。一个CMenu变量并不一定对应着一个菜单。3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
===================
CMenu对象析构时会将与之关联的菜单资源也释放掉,所以这个菜单就没了。4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?
============
你总体的问题是将C++中的对象和Windows中资源对象混为一谈了。
HMENU 指向菜单的指针
CMenu MFC对菜单的封装 CMenu.Detach() : CMenu不在对这个菜单进行管理