MFC的GDI对象的构造与释放

首先要区分c++对象与GDI对象。GDI对象对应于系统资源,例如一个窗口,GDI对象就是这个窗口分配的一块内存,而这块内存由句柄标识;c++对象只是封装了这个句柄,例如CWinApp类封装了m_hInstance, CWnd封装了m_hWnd。

 

一、设备上下文(DC)

CDC对象封装了设备上下文的一个句柄m_hDC,如果通过GetDC();来操作设备上下文,一定要在退出函数时调用ReleaseDC();

GetDC();相当于获得了一个当前设备上下文的一个副本,调用它是会重新分配内存的,ReleaseDC();相当于将新分配的内存释放掉。

 

如果CClientDC来操作设备上下文,那么它会在对象的析构函数中调用ReleaseDC();

 

二、一般GDI对象(画刷、字体、位图、笔...)

如果通过全局函数来加载,例如

HBITMAP hBitmap;	
hBitmap = LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_BITMAP1));	
//将其选入设备上下文	
// ...	
// ...
DeleteObject(hBitmap);


 一定要在使用后调用DeleteObject(hBitmap);

虽然其并没为资源新分配内存,但会让句柄值设为NULL,毕竟句柄值的资源有限。

CSDN上的原话:The application must call the DeleteObject function to delete each bitmap handle returned by theLoadBitmap function

 

 如果是通过c++对象来加载资源,例如: 

CBitmap bitmap;//局部变量
 bitmap.LoadBitmap(IDB_BITMAP1);

在CBitmap中的析构函数中会调用DeleteObject。


 

       

 
 

你可能感兴趣的:(MFC)