HWND是Windows系統中對所有視窗的一種標識,即視窗控制代碼。這是一個SDK概念。
CWnd是MFC類庫中所有視窗類別的基類。微軟在MFC中將所有視窗的通用操作都封裝到了這個類中,如:ShowWindow等等,同時它也封裝了視窗控制代碼即m_hWnd成員。
由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 差別很大
HWND 是 SDK 定義的類型, 是一個無確切意義的 32-bit 值,在調用 API 時用於指代表單。
CWnd* 是一個有確切意義的指標,指向一個 MFC 表單類 CWnd 的執行個體。因為 MFC 對 SDK 做了封裝,大部分調用都可以用 CWnd* 作為參數,所以很容易混淆。從一個 CWnd* 擷取控制代碼的方法是 pWnd->GetSafeHwnd(), 他比 pWnd->m_hWnd 安全,因為前者在 pWnd == NULL 的時候返回 NULL 而後者出現 access violation
從 hWnd 轉換到 CWnd * 一個可以使用的方法是 CWnd::FromHandle
CWnd *pTempWnd = CWnd::FromHandle(hWnd); // 如果 hWnd 存在對應的 CWnd* ,則返回其指標,否則,建立一個 MFC 臨時表單並返回其指標。
注意這個函數會返回臨時表單的指標,如果需要更安全,調用 CWnd::FromHandlePermanent ,他在不存在對應的 CWnd* 時返回 NULL。
——————————————————————————————————————————————————————————
CWnd是MFC的視窗基類。 HWND是Windows視窗控制代碼。 前者是一個C++對象,後者是一個類似於指標地址的數字型對象。
CWnd可以看成是對Windows視窗操作的封裝,而封裝的核心就是使用Windows視窗控制代碼(即HWND)來操作視窗.
CWnd可以通過CWnd::GetSafeHwnd()或成員變數m_hWnd來獲得該視窗對象的HWND視窗控制代碼。
HWND可以通過CWnd的靜態函數:CWnd::FromHandle()由控制代碼執行個體化一個CWnd對象出來。
——————————————————————————————————————————————————————————
1: SDK函數
定義
HWND GetDlgItem(HWND hDlg, int nIDDlgItem);
參數
hDlg
指定對話方塊的視窗控制代碼。
nIDDlgItem
控制項的標識符(ID)。
傳回值
如果函數調用成功,傳回值為指定控制項的視窗控制代碼。如果函數調用失敗,傳回值為 NULL ,表示無效的對話方塊控制代碼或者指定控制項不存在。要擷取更多錯誤資訊,請調用 GetLastError 函數。
說明
使用該函數時,你可以指定任何視窗,而不只是對話方塊視窗,只要 hDlg 指定的是一個父視窗並且子視窗具有標識符(在調用 CreateWindow 或 CreateWindowEx 函數建立子視窗時通過 hMenu 參數設定),GetDlgItem 將返回一個有效子視窗控制代碼。
例如:(調用形式採用如下的方式來調用,而且兩個參數的是在平台SDK中調用的)
::GetDlgItem(this->m_hWnd,IDC_XXXX_SIZE); //this->m_hWnd指的是某個視窗的控制代碼, IDC_XXX_SIZE是你需要動作的某個控制項ID
2: 類成員函數
定義
CWnd::GetDlgItem(int nID)
例如: (CWnd::GetDlgItem(int nID)在視窗中調用)
GetDlgItem(IDC_v1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_v2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_v3)->ShowWindow(SW_HIDE);