CWnd與HWND的區別與轉換

CWnd與HWND的區別與轉換   轉載http://blog.sina.com.cn/s/blog_962250db01019or9.html

 一、區別

 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得到CWnd*:

 CWnd wnd;
 HWnd hWnd;
 wnd.Attach(hWnd);
 通常一個窗口資源已經和一個CWnd類的對象關聯起來的,由於一般來說這個類是自己創建的,所以自然知道怎麼得到指向這個類的指針。如果沒有就創建一個CWnd對象,將這個對象與窗口資源的hWnd句柄關聯起來。(如上邊的語句)。如果用
 static CWnd* CWnd::FromHandle(HWND hWnd) ;
 則返回值是一個暫時的CWnd對象,並且我們確保返回值爲非空,也就是hWnd是有效的。
 static CWnd* CWnd::FromHandlePermanent(HWND hWnd) ;
 返回的是一個永久的對象。只有在返回的CWnd在類表裏已經存在是返回值爲非空。
 由CWnd獲取HWnd就容易多了,因爲它的一個成員m_hWnd就是所對應窗口的句柄。

 wnd->m_hWnd。

 CWnd得到HWnd
 CWnd wnd;
 HWND hWnd;
 hWnd = wnd.m_hWnd;
 // or
 hWnd = wnd.GetSafeHwnd(); //推薦
 HWnd得到CWnd*
 建立一個CWnd對象,然後使用Attach將HWND和CWnd對象聯繫起來。
 CWnd *pWnd;
 HWND hWnd;
 pWnd = CWnd::FromHandle(hWnd);
 // or
 pWnd->Attach(hWnd);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章