VC中的CWnd指標和HWnd的區別於聯絡

來源:互聯網
上載者:User

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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.