1. 程式人生 > >CWND和HWND之間的關係和轉換 和獲取方法

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時,搜尋上一個, 反之。