1.CBitmap-------------------------------------------------------------------------------------app
一、類層次
CObject
CGdiObject
CBitmap
BOOL CGdiObject::~CGdiObject()
{
if (m_hObject == NULL)
return FALSE;
return ::DeleteObject(Detach());
}
從CGdiObject的析構函數中,能夠看出有先Detach再Delete函數
二、BOOL CBitmap::LoadBitmap(LPCTSTR lpszResourceName);
BOOL CBitmap::LoadBitmap(UINT nIDResource);
對應Win32 SDK中的LoadBitmap
HBITMAP LoadBitmap(
HINSTANCE hInstance, // handle to application instance
LPCTSTR lpBitmapName // name of bitmap resource
);
注意:由LoadBitmapthis
2.CDC-----------------------------------------------------------------------------------------------線程
class CDC : public CObject
{
public:
static CDC* PASCAL FromHandle(HDC hDC);
// Attach與Detach函數
BOOL Attach(HDC hDC);
HDC Detach();
// 構造與析構函數
CDC();
virtual ~CDC();
}指針
一、CDC的構造函數和析構函數
CDC::CDC()
{
m_hDC = NULL;
}
CDC::~CDC()
{
if (m_hDC != NULL)
::DeleteDC(Detach());
}
從析構函數中能夠看出,釋放了關聯的HDC
而且在Delete以前還Detach了對象
二、Attach用於將CDC的對象和HDC的句柄關聯在一塊兒
Detach則相反
BOOL CDC::Attach(HDC hDC)
{
if (hDC == NULL)
{
return FALSE;
}it
m_hDC = hDC;
CHandleMap* pMap = afxMapHDC(TRUE); // create map if not exist
pMap->SetPermanent(m_hDC, this);io
return TRUE;
}
HDC CDC::Detach()
{
HDC hDC = m_hDC;
if (hDC != NULL)
{
CHandleMap* pMap = afxMapHDC(); // don't create if not exist
if (pMap != NULL)
pMap->RemoveHandle(m_hDC);
}
m_hDC = NULL;
return hDC;
}class
三、FromHandle從映射表中查找有無hDC對應的CDC
有則返回其指針;沒有則先new一個臨時的CDC的對象,將其和hDC關聯再返回其指針
注意:這個臨時的CDC對象不用由用戶delete,系統的空閒線程會處理
CDC* PASCAL CDC::FromHandle(HDC hDC)
{
CHandleMap* pMap = afxMapHDC(TRUE); //create map if not exist
CDC* pDC = (CDC*)pMap->FromHandle(hDC); // 若是pMap中不存在hDC關聯的CDC對象,則new一CDC對象並和hDC關聯
return pDC;
}構造函數
3.CDialog----------------------------------------------------------------------------------
一、CDialog析構時銷燬了與之關聯的窗口
CDialog::~CDialog()
{
if (m_hWnd != NULL)
{
DestroyWindow();
}
}
4.CWnd---------------------------------------------------------------------------------------
一、CWnd析構時銷燬了與之關聯的窗口
CWnd::~CWnd()
{
if (m_hWnd != NULL)
{
DestroyWindow();
}
}
二、獲取桌面窗口句柄static CWnd* PASCAL CWnd::GetDesktopWindow();對應Win32 SDK中的爲HWND GetDesktopWindow(VOID);