Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄。这就是Attach主要完成的任务。

Detach。如前所述,WNDCLASS其实和CWnd根本没有什么关系。它们之间只是通过CWnd的成员HWND联系起来的。

如果把 Attach看做“联姻”的话,那么Detach就是“离婚”了,通俗地说,就是切断一个CWnd对象和一个有效窗口的脐带。CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是句柄,(包括窗口句柄,DC句柄,线程句柄等)。m_hWnd,m_hDC,m_hThread如果这些类对象的这些句柄为空,就表示无效对象。假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是Valid的了。你可能跟踪看看Attach的实现,其实就是给m_hxxx赋值,而Detach就是值复位。

CBitmap Detach和DeleteObject的关系

注意:当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源;

加速器表:DesteoyAcceleratorTable;

位图:DeleteObject;

光标:DestroyCursor;

图标:Destroylcon;

菜单:DestroyMenu

HBITMAP/CBitmap/BITMAP 三者之间的关系转换:

HBITMAP hBitmap;

CBitmap bitmap;

BITMAP bm;

bitmap.Attach(hBitmap);//由HBITMAP 得到关联的CBitmap

bitmap.GetBitmap(&bm); // 由CBitmap 得到关联的BITMAP

hBitmap=(HBITMAP)bitmap.GetSafeHandle();//由CBitmap得到相关的HBITMAP

说明:

1. Detach将使C++的对象与GDI对象分离开来,但二者都没有释放。此时必须分别用deletepBmp和DeleteObject将二者分别释放;

2. m_Bitmap->DeleteObject将使GDI对象被释放,而C++对象本身不会释放。你可以用Attach重新使其与某个GDI对象关联,或者,用delete将其释放;

3.deletepBmp(注意,我们假定析构时不调用DeleteObject)将使C++对象消亡,而对应的GDI对象依然存在。要使GDI对象释放,必须再次调用DeleteObject。

最新文章

  1. linux菜鸟日记(2)
  2. lua和整合实践
  3. 不同java 版本的新功能
  4. linux 下部署nodejs(两种方式)
  5. Struts2(十一)OGNL标签三与Struts2标签
  6. 找模式串[XDU1032]
  7. 在Eclipse中运行cmd
  8. muduo网络库使用心得
  9. Linux文件和目录的粘滞位(sticky bit)
  10. ccf--20150903--模板生成系统
  11. CProgressCtrl进度条控件实现进度滚动效果
  12. HTTP协议综合
  13. cesium编程入门(五)绘制形状
  14. Android开发之Fragment传递參数的几种方法
  15. Mysql中文汉字转拼音的实现(每个汉字转换全拼)
  16. hook NtQueryDirectoryFile实现文件隐藏
  17. 【Python3 爬虫】06_robots.txt查看网站爬取限制情况
  18. linux下网卡bonding配置
  19. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
  20. iOS 给三方日历加上农历

热门文章

  1. 关于python切片操作笔记
  2. windows 运行库与dll文件
  3. python基础语法19 面向对象总结,pickle保存对象注意事项
  4. pycharm调整选中的变量的颜色
  5. struts2学习1
  6. Android Studio 星云常用配置工具箱
  7. Makefile之编译运行连接库方法
  8. jenkins更新为国内源
  9. 【VS开发】【C/C++开发】关于boost库的C++11导致的undefined符号问题
  10. 【C/C++开发】c++ 工具库 (zz)