有关MFC类与其窗口句柄

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。

原文地址:https://www.cnblogs.com/arxive/p/11748240.html