雖然gilbert之前介紹過cwnd和hwnd的區別, 但是這裡和其他幾個cdc, hdc放在一起重申一下其中的區別和關係.
1.物件和控制代碼
cwnd是類, hwnd是控制代碼, cwnd封裝了hwnd
cwnd wnd;
hwnd hwnd;
wnd.attach(hwnd);//控制代碼到物件
wnd->m_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);
CWnd物件和視窗的關係
很多人認為mfc中的cwnd物件就是視窗,其實不然,它只是擁有乙個與視窗相關聯的扭帶,即視窗控制代碼。可以模擬一下cwnd物件 class cwnd bool cwnd createwindow bool cwnd showwindow intcmdshow bool cwnd updatewind...
CWND和HWND之間的關係和轉換 和獲取方法
一 區別 hwnd是控制代碼,cwnd是mfc窗體類,cwnd中包含hwnd控制代碼成員物件是m hwnd.hwnd是windows系統中對所有視窗的一種標識,即視窗控制代碼。這是乙個sdk概念。cwnd是mfc類庫中所有視窗類的基類。微軟在mfc中將所有視窗的通用操作都封裝到了這個類中,如 sho...
CWND和HWND之間的關係和轉換 和獲取方法
一 區別 hwnd是控制代碼,cwnd是mfc窗體類,cwnd中包含hwnd控制代碼成員物件是m hwnd.hwnd是windows系統中對所有視窗的一種標識,即視窗控制代碼。這是乙個sdk概念。cwnd是mfc類庫中所有視窗類的基類。微軟在mfc中將所有視窗的通用操作都封裝到了這個類中,如 sho...