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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章