CWnd和CDC, hwnd和hdc的區別

2021-06-11 10:19:16 字數 1540 閱讀 1747

雖然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...