MFC亂七八糟筆記

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);

相關文章
相關標籤/搜索