cwnd、cdc、hwnd和hdc

1.對象和句柄

CWnd是類, HWnd是句柄, CWnd封裝了HWnd

AfxGetMainWnd()->m_hwnd;

同樣的, CDC和HDC也是這樣的關係:

CDC *pDC=new CDC;

HDC hdc;

pDC->GetSafeHdc();//通過對象獲得句柄:

pDC->Attach(hdc); //通過句柄獲得對象:
HWND是SDK定義的類型,是一個無確切意義的32-bit值,在調用API時用於指代窗體。
CWnd*是一個有確切意義的指針,指向一個MFC窗體類CWnd的實例。因爲MFC對SDK做了封裝,大部分調用都可以用CWnd*作爲參數,所以很容 易混淆。從一個CWnd*獲取句柄的方法是pWnd->GetSafeHwnd(),他比 pWnd->m_hWnd安全,因爲前者在pWnd == NULL的時候返回NULL而後者出現access violation.

2. CWnd和CDC, hwnd和hdc

所有跟窗口相關的操作都被封裝在CWnd類中; 所有跟繪圖相關的操作都被封裝在CDC類中.

hwnd句柄是描述一個窗口的形狀、位置、大小、是否顯示、它的父窗口、兄弟窗口、等等的一組數據結構;hdc句柄是一個實實在在的用於具體表現這個窗口時,需要對這個窗口有個場合來實現的地方。

3. 使用不同的CDC繪圖

CClientDC客戶區dc。CWindowDC整窗口dc。CDC 任何dc。

/*
CDC *pDC=CWnd::GetDC();
//此處直接使用CWnd類的GetDC,其返回值爲CDC*
//SDK中的同名函數使用返回的是HDC

*/
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
CWnd::ReleaseDC(pDC);

/*//使用CClientDC繪圖
CClientDC派生自CDC,在構造的時候調用GetDC,
在析構的時候調用ReleaseDC。使得我們不必
顯示調用GetDC與ReleaseDC。
*/
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

/*//使用CWindowDC繪圖
同樣派生自CDC,構造調用GetWindowDC,

析構時調用ReleaseDC()。
可以訪問整個屏幕區域,包括客戶區和非客戶區。
*/
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章