首先要区分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。