hur.cn - 华软网

 热门搜索

CMenu类的 detach()函数的不解,菜单句柄与菜单分离是什么意思呢?

  作者:未知    来源:网络    更新时间:2011/6/12
CMenu类的 detach()函数的不解,菜单句柄与菜单分离是什么意思呢?
---------------------------------------------
C++">
SetMenu(NULL);  //移除菜单
CMenu menu;     //局部菜单对象 
menu.LoadMenu(IDR_MAINFRAME);  //从一个资源加载菜单
SetMenu(&menu);  //设置并显示菜单

        menu.Detach();  //?????????

以上代码,是vc++深入详解中的.
menu是局部对象.
书中说,由于 menu 是局部对象,所以最后必须加上 menu.Detach()方法.
目的是将菜单对象与菜单句柄分离.
我不明白,

1.菜单句柄 与菜单对象不是 一个东西吗? 句柄不就是对象的一个标识吗?
2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?

---华软 网友回答---
CMenu Class  

An encapsulation of the Windows HMENU. 

因为你定义的是CMenu句柄变量,出了作用域,它所关联的HMENU资源也会销毁
---华软网友回复---
引用 1 楼 visualeleven 的回复:
CMenu Class  

An encapsulation of the Windows HMENU. 

因为你定义的是CMenu句柄变量,出了作用域,它所关联的HMENU资源也会销毁

但是 detach 后,菜单对象销毁时,它所关联的HMENU资源不会销毁了,这会不会内存泄露呀,因为
hmenu资源是不是,永远也得不到销毁呀?
菜单对象不管他了,谁来管他呢?



---华软网友回复---
SetMenu后 已经接管了hmenu  程序退出时会销毁它的
---华软网友回复---
对象和句柄还是有区别的,句柄是属于系统内核的,与对象联系以后会随对象的消亡而销毁。
---华软网友回复---
对象是C++类的内容
句柄包括显示的界面内容,而这通过句柄关联。
解除移位着释放资源。不在占用。对象就可以删除了。
---华软网友回复---
1.菜单句柄 与菜单对象不是 一个东西吗? 句柄不就是对象的一个标识吗?
===============
不是一个东西,菜单对象是一个C++类的对象,它只是CMenu类的一个对象,只有关联了一个菜单句柄之后才能真正的操作一个菜单。另外,“句柄不就是对象的一个标识吗?”这里的对象如果是指C++对象,那么这句话是错的。

2.菜单句柄 到底是什么东西呢?我一直认为,句柄就是一个数,就是菜单对象的"身份证号",我的理解不对吗?
==============
菜单是一个资源,而菜单句柄是这个资源的一个标识。其实这个还是第一个问题。一个CMenu变量并不一定对应着一个菜单。

3.二者分开了,局部的menu对象销毁时,菜单句柄不会销毁是什么意思,句柄不就是一个数字吗(一个身份证号吧!)
===================
CMenu对象析构时会将与之关联的菜单资源也释放掉,所以这个菜单就没了。

4.菜单句柄也是一个对象吗?如果句柄也是对象的话,菜单对象销毁后,句柄对象没有同步销毁,会不会造成"内存泄露"呀,
因为菜单句柄所代表的对象(应该占据内存吧),永远不会销毁呀?
============
你总体的问题是将C++中的对象和Windows中资源对象混为一谈了。
---华软网友回复---
谢谢6楼老师
---华软网友回复---
菜单      资源,内存,总之,实现菜单功能的一堆东西
HMENU      指向菜单的指针
CMenu      MFC对菜单的封装

   CMenu.Detach()   : CMenu不在对这个菜单进行管理

---华软网友回复---
支持一下      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。