雖然Gilbert之前介紹過(guò)CWnd和HWnd的區(qū)別, 但是這里和其他幾個(gè)CDC, HDC放在一起重申一下其中的區(qū)別和關(guān)系.
1.對(duì)象和句柄
CWnd是類, HWnd是句柄, CWnd封裝了HWnd
CWnd wnd;
HWnd hWnd;
wnd.Attach(hWnd);//句柄到對(duì)象
wnd->m_hWnd;// 對(duì)象到句柄
當(dāng)然一般在程序中是這樣獲得句柄:
AfxGetMainWnd()->m_hwnd;
同樣的, CDC和HDC也是這樣的關(guān)系:
CDC *pDC=new CDC;
HDC hdc;
pDC->GetSafeHdc();//通過(guò)對(duì)象獲得句柄:
pDC->Attach(hdc); //通過(guò)句柄獲得對(duì)象:
HWND是SDK定義的類型,是一個(gè)無(wú)確切意義的32-bit值,在調(diào)用API時(shí)用于指代窗體。
CWnd*是一個(gè)有確切意義的指針,指向一個(gè)MFC窗體類CWnd的實(shí)例。因?yàn)镸FC對(duì)SDK做了封裝,大部分調(diào)用都可以用CWnd*作為參數(shù),所以很容易混淆。從一個(gè)CWnd*獲取句柄的方法是pWnd->GetSafeHwnd(),他比 pWnd->m_hWnd安全,因?yàn)榍罢咴趐Wnd == NULL的時(shí)候返回NULL而后者出現(xiàn)access violation.
2. CWnd和CDC, hwnd和hdc
所有跟窗口相關(guān)的操作都被封裝在CWnd類中; 所有跟繪圖相關(guān)的操作都被封裝在CDC類中.
hwnd句柄是描述一個(gè)窗口的形狀、位置、大小、是否顯示、它的父窗口、兄弟窗口、等等的一組數(shù)據(jù)結(jié)構(gòu);hdc句柄是一個(gè)實(shí)實(shí)在在的用于具體表現(xiàn)這個(gè)窗口時(shí),需要對(duì)這個(gè)窗口有個(gè)場(chǎng)合來(lái)實(shí)現(xiàn)的地方。
3. 使用不同的CDC繪圖
CClientDC 客戶區(qū)dc;
CWindowDC 整窗口dc;
CDC 任何dc;
/*
CDC *pDC=CWnd::GetDC();
//此處直接使用CWnd類的GetDC,其返回值為CDC*
//SDK中的同名函數(shù)使用返回的是HDC
*/
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
CWnd::ReleaseDC(pDC);
/*//使用CClientDC繪圖
CClientDC派生自CDC,在構(gòu)造的時(shí)候調(diào)用GetDC,
在析構(gòu)的時(shí)候調(diào)用ReleaseDC。使得我們不必
顯示調(diào)用GetDC與ReleaseDC。
*/
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
/*//使用CWindowDC繪圖
同樣派生自CDC,構(gòu)造調(diào)用GetWindowDC,
析構(gòu)時(shí)調(diào)用ReleaseDC()。
可以訪問(wèn)整個(gè)屏幕區(qū)域,包括客戶區(qū)和非客戶區(qū)。
*/
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
所有知識(shí)來(lái)自于互聯(lián)網(wǎng).
聯(lián)系客服