CWND和HWND之間的關係和轉換 和獲取方法

2021-09-29 01:19:03 字數 2678 閱讀 1246

一、區別

hwnd是控制代碼,cwnd是mfc窗體類,cwnd中包含hwnd控制代碼成員物件是m_hwnd.

hwnd是windows系統中對所有視窗的一種標識,即視窗控制代碼。這是乙個sdk概念。   

cwnd是mfc類庫中所有視窗類的基類。微軟在mfc中將所有視窗的通用操作都封裝到了這個類中,如:showwindow等等,同時它也封裝了視窗控制代碼即m_hwnd成員。

三、如何得到視窗控制代碼 hwnd handle

1、handle=this->m_hwnd

2、getdlgitem(id_edit_name);

3、handle=::getdlgitem(this,idc_static_mode); //得到本窗體內某個控制項的控制代碼

四、轉換

cwnd * pcwnd;

hwnd handle;

pcwnd=fromhandle(handle);

handle=getsafehwnd(pcwnd);

五、其他

hwnd是sdk介面的概念,並沒有實際物件操作的位址空間。它只是乙個32位的無符號整型數值,代表了控制代碼號handle。

cwnd是mfc類庫中所有視窗的基類。微軟在mfc中將所有視窗的通用操作都封裝到這個類中,如:showwindow等等,同時它也封裝了視窗控制代碼即m_hwnd成員。

相互之間的轉換:

1、  hwnd轉換成cwnd

cwnd cwnd;

hwnd hwnd;

cwnd.attach(hwnd);

通常乙個視窗資源已經和乙個cwnd類的物件相關聯,而這個類物件是自己建立的,所以很容易得到指向這個類的指標。但是,若是只是建立了乙個cwnd物件,可以將這個物件與視窗資源的hwnd控制代碼關聯起來呢。(這話聽不懂???)

static cwnd* cwnd::fromhandle(hwnd hwnd);//返回值是乙個暫時的cwnd物件,並且確保返回值不為空。

static cwnd* cwnd::fromhandlepermanent(hwnd hwnd);//返回的是乙個永久的物件,只有返回的cwnd在類表中存在,返回值才不為空,否則則為空。

2、  cwnd轉換成hwnd

cwnd中封裝了hwnd,即成員m_hwnd;

cwnd->m_hwnd;//這樣即可獲取hwnd;

或者cwnd->getsafehwnd();//這種方式更安全

3、  安全性問題

從 hwnd 轉換到 cwnd * 乙個可以使用的方法是 cwnd::fromhandle:

cwnd *ptempwnd = cwnd::fromhandle(hwnd); // 如果 hwnd 存在對應的 cwnd* ,則返回其指標,否則,建立乙個 mfc 臨時窗體並返回其指標。

注意這個函式會返回臨時窗體的指標,如果需要更安全,呼叫 cwnd::fromhandlepermanent ,他在不存在對應的 cwnd* 時返回 null。

4、  例項

cwnd* mark1;

mark1=findwindow(null,"test");//test是我的當前例項視窗的title

//從cwnd*轉換成hwnd

hwnd tmp=mark1->getsafehwnd();     //得到它的hwnd 

//從hwnd轉換成cwnd*

pcwnd=fromhandle(tmp);

pcwnd->setwindowtext("asdfasdf");//隨便改個title

改變視窗屬性:

long setwindowlong(hwnd hwnd,   指定想要改變其屬性的視窗控制代碼

int nindex,                          設定的屬性值

long denewlong)             設定的新值

nindex的取值:

gwl_exstyle   設定乙個新的擴充套件視窗風格

gwl_style     設定乙個新的視窗風格

gwl_wndproc設定乙個新的視窗過程函式,用於處理一系列的訊息

gwl_hinstance設定乙個新的應用程式例項控制代碼

gwl_id        設定乙個新的標識

gwl_userdata設定與視窗相關的32位值

dwl_dlgproc 設定新的對話方塊視窗過程

dwl_msgresult設定在對話方塊過程中處理的訊息返回值

例如:prevproc = (wndproc) setwindowlong(getdlgitem(idc_edit1)->m_hwnd,gwl_wndproc,(long) neweditproc)  //neweditproc為新的視窗過程函式

注意edit control控制項必須勾選multiline選項才能接受回車鍵訊息。

hwnd getwindow(hwnd hwnd,uint ucmd);     //獲取視窗的控制代碼.

//gw_hwndnext為查詢z次序中位於指定視窗下方的視窗控制代碼

//gw_hwndprev為查詢z次序中位於指定視窗上方的視窗控制代碼

cwnd* getnextwindow(uint nflag = gw_hwndnext)const;

hwnd getnextdlgtabitem(hwnd hdlg, hwnd hctl,boolbprevious)

hdlg為被搜尋的對話方塊/hctl為被搜尋的起始控制項/bprevious為true時,搜尋上乙個, 反之。

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中將所有視窗的通用操作都封裝到了這個類中,如 sh...

CWnd物件和視窗的關係

很多人認為mfc中的cwnd物件就是視窗,其實不然,它只是擁有乙個與視窗相關聯的扭帶,即視窗控制代碼。可以模擬一下cwnd物件 class cwnd bool cwnd createwindow bool cwnd showwindow intcmdshow bool cwnd updatewind...