CWND和HWND之間的關係和轉換 和獲取方法
一、區別
HWND是控制代碼,CWnd是MFC窗體類,CWnd中包含HWND控制代碼成員物件是m_hWnd.
HWND是Windows系統中對所有視窗的一種標識,即視窗控制代碼。這是一個SDK概念。
CWnd是MFC類庫中所有視窗類的基類。微軟在MFC中將所有視窗的通用操作都封裝到了這個類中,如:ShowWindow等等,同時它也封裝了視窗控制代碼即m_hWnd成員。
二、如何得到視窗物件指標CWnd * pCWnd
1、在窗體裡,直接用 this->,//this就是本窗體的視窗物件指標
2、主窗體的類物件指標:AfxGetApp()->m_pMainWnd->, //AfxGetApp()->m_pMainWnd就是主窗體的視窗物件指標
3、pCWnd=GetDlgItem(ID_EDIT_NAME);//GetDlgItem 函式可以得到某個控制元件的視窗物件指標
三、如何得到視窗控制代碼 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時,搜尋上一個, 反之。