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