CWnd與HWND的區別與聯繫(相互轉換)完全解析

區別

           首先,從這兩個單詞的第一個字母即可知道兩者之間的差別。熟悉MFC的人都知道在MFC中,類基本上都是以C開頭的,這是一種規則約定,目的就是讓人一看就知道它是一個類!

          因此,CWnd第一個字母C指的是class的意思,即CWnd是一個類;HWND第一個字母H指的是handle的意思,即HWND是一個句柄


CWnd:是MFC類庫中所有窗口類的基類。MFC將所有窗口的通用操作都封裝到CWnd類中,如MoveWindow、ShowWindow;同時,它也封裝了窗口句柄,即m_hWnd成員。

HWND:即Windows窗口句柄,是Windows系統中對所有窗口的一種唯一標識

聰明的讀者可以發現,CWnd其實就是MFC中的一個類名;而HWND是Windows中窗體句柄的類型,一個類似於指針地址的數字型對象。


聯繫(相互轉換)


1、由HWND得到CWnd:

 方法一:通過CWnd的Attach()函數來獲取

	CWnd wnd;
	HWND hWnd;
	wnd.Attach(hWnd);
            CWnd的Attach()函數的作用基本上就是包一個句柄附加到一個MFC的對象上,即將CWnd對象的HWND成員指向這個窗口句柄hWnd。


方法二:HWND可以通過CWnd的靜態函數:CWnd::FromHandle()或CWnd::FromHandlePermanent(),由句柄實例化一個CWnd對象出來。

如果用FromHandle(),返回值是一個臨時CWnd對象,並且我們確保返回值爲非空,也就是hWnd是有效的。(函數聲明如下:)

static CWnd*   CWnd::FromHandle(HWND   hWnd) ;


如果用FromHandlePermanent(),返回值是一個永久對象,只有在返回的CWnd在類表裏已經存在,則返回值爲非空。(函數聲明如下:)

static CWnd*   CWnd::FromHandlePermanent(HWND   hWnd)  ;

2、由CWnd獲取HWnd:

       

         方法一:從CWnd獲取HWnd就容易多了,因爲它的一個成員變量m_hWnd就是所對應窗口的句柄。

            wnd->m_hWnd

        方法二:也可以通過成員函數CWnd::GetSafeHwnd()來獲得該窗口對象的HWND窗口句柄。





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