一、區別
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...