共用方式為


CContainedWindowT 類別

這個類別會實作包含在另一個 物件內的視窗。

重要

這個類別及其成員不能用於在 Windows 執行階段 中執行的應用程式。

語法

template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class CContainedWindowT : public TBase

參數

TBase
新類別的基類。 預設基類為 CWindow

TWinTraits
定義視窗樣式的特性類別。 預設值為 CControlWinTraits

注意

CContainedWindow 是 的 CContainedWindowT特製化。 如果您要變更基類或特性,請直接使用 CContainedWindowT

成員

公用建構函式

名稱 描述
CContainedWindowT::CContainedWindowT 建構函式。 初始化數據成員,以指定哪些訊息對應將處理自主視窗的訊息。

公用方法

名稱 描述
CContainedWindowT::Create 建立視窗。
CContainedWindowT::D efWindowProc 提供預設訊息處理。
CContainedWindowT::GetCurrentMessage 傳回目前訊息。
CContainedWindowT::RegisterWndSuperclass 註冊自主視窗的窗口類別。
CContainedWindowT::SubclassWindow 子類別化視窗。
CContainedWindowT::SwitchMessageMap 變更用來處理自主視窗訊息的訊息對應。
CContainedWindowT::UnsubclassWindow 還原先前子類別化的視窗。
CContainedWindowT::WindowProc (靜態)處理傳送至自主視窗的訊息。

公用資料成員

名稱 描述
CContainedWindowT::m_dwMsgMapID 識別哪些訊息對應會處理自主視窗的訊息。
CContainedWindowT::m_lpszClassName 指定新視窗類別所依據之現有視窗類別的名稱。
CContainedWindowT::m_pfnSuperWindowProc 指向視窗類別的原始視窗程序。
CContainedWindowT::m_pObject 指向包含的物件。

備註

CContainedWindowT 會實作包含在另一個 物件內的視窗。 CContainedWindowT的視窗程式會使用包含物件中的訊息對應,將訊息導向適當的處理程式。 建構 物件時,您可以指定應該使用哪一個 CContainedWindowT 訊息對應。

CContainedWindowT 可讓您透過將現有的視窗類別上層化來建立新的視窗。 Create方法會先註冊以現有類別為基礎的視窗類別,但使用 CContainedWindowT::WindowProcCreate 然後根據這個新的視窗類別建立視窗。 的每個實例 CContainedWindowT 都可以將不同的視窗類別超類別。

CContainedWindowT 也支援視窗子類別化。 SubclassWindow 方法會將現有視窗附加至 CContainedWindowT 物件,並將視窗程序變更至 CContainedWindowT::WindowProc。 每個 CContainedWindowT 執行個體都可以子類別化為不同的視窗。

注意

針對任何指定的 CContainedWindowT 物件,呼叫 CreateSubclassWindow。 您不應該在同一個物件上叫用這兩種方法。

當您在 ATL 專案精靈中使用 [根據 新增控件] 選項時,精靈會自動將數據成員新增 CContainedWindowT 至實作控件的類別。 下列範例示範如何宣告自主視窗:

public:
   // Declare a contained window data member
   CContainedWindow m_ctlEdit;

   // Initialize the contained window:
   // 1. Pass "Edit" to specify that the contained 
   //    window should be based on the standard 
   //    Windows Edit box
   // 2. Pass 'this' pointer to specify that CAtlEdit 
   //    contains the message map to be used for the 
   //    contained window's message processing
   // 3. Pass the identifier of the message map. '1'
   //    identifies the alternate message map declared
   //    with ALT_MSG_MAP(1)
   CAtlEdit()
      : m_ctlEdit(_T("Edit"), this, 1)
   {
      m_bWindowOnly = TRUE;
   }

 

// Declare the default message map, identified by '0'
BEGIN_MSG_MAP(CAtlEdit)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
   CHAIN_MSG_MAP(CComControl<CAtlEdit>)
// Declare an alternate message map, identified by '1'
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()

 

// Define OnCreate handler
// When the containing window receives a WM_CREATE
// message, create the contained window by calling
// CContainedWindow::Create
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
   BOOL& /*bHandled*/)
{
   RECT rc;
   GetWindowRect(&rc);
   rc.right -= rc.left;
   rc.bottom -= rc.top;
   rc.top = rc.left = 0;
   m_ctlEdit.Create(m_hWnd, rc, _T("hello"), WS_CHILD | WS_VISIBLE | 
      ES_MULTILINE | ES_AUTOVSCROLL);
   return 0;
}
如需 請參閱
建立控制項 ATL 教學課程
在 ATL 中使用視窗 ATL 視窗類別
ATL 專案精靈 建立 ATL 專案
Windows Windows SDK 中的 Windows 和後續主題

繼承階層架構

TBase

CContainedWindowT

需求

標頭: atlwin.h

CContainedWindowT::CContainedWindowT

建構函式會初始化數據成員。

CContainedWindowT(
    LPTSTR lpszClassName,
    CMessageMap* pObject,
    DWORD dwMsgMapID = 0);

CContainedWindowT(
    CMessageMap* pObject,
    DWORD dwMsgMapID = 0)
    CContainedWindowT();

參數

lpszClassName
[in]將依據自主視窗的現有視窗類別名稱。

pObject
[in]宣告訊息對應之包含物件的指標。 這個物件的類別必須衍生自 CMessageMap

dwMsgMapID
[in]識別將處理自主視窗訊息的訊息對應。 預設值 0 會指定以 BEGIN_MSG_MAP 宣告的預設訊息對應。 若要使用以 ALT_MSG_MAP(msgMapID) 宣告的替代訊息對應,請傳遞 msgMapID

備註

如果您想要透過 Create 建立新的視窗,您必須傳遞 lpszClassName 參數現有視窗類別的名稱。 如需範例,請參閱 CContainedWindow 概觀。

有三個建構函式:

  • 具有三個自變數的建構函式通常稱為 。

  • 具有兩個自變數的建構函式會使用 來自 TBase::GetWndClassName的類別名稱。

  • 如果您想要稍後提供自變數,則會使用不含自變數的建構函式。 當您稍後呼叫 Create時,必須提供視窗類別名稱、訊息對應物件和訊息對應識別碼。

如果您透過 SubclassWindow 將現有的視窗子類別化, 則不會使用 lpszClassName 值;因此,您可以傳遞此參數的 NULL。

CContainedWindowT::Create

呼叫 RegisterWndSuperclass 來註冊以現有類別為基礎的窗口類別,但使用 CContainedWindowT::WindowProc

HWND Create(
    HWND hWndParent,
    _U_RECT rect,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

HWND Create(
    CMessageMap* pObject,
    DWORD dwMsgMapID,
    HWND hWndParent,
    _U_RECT rect,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

HWND Create(
    LPCTSTR lpszClassName,
    CMessageMap* pObject,
    DWORD dwMsgMapID,
    HWND hWndParent,
    _U_RECT rect,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

參數

lpszClassName
[in]將依據自主視窗的現有視窗類別名稱。

pObject
[in]宣告訊息對應之包含物件的指標。 這個物件的類別必須衍生自 CMessageMap

dwMsgMapID
[in]識別將處理自主視窗訊息的訊息對應。 預設值 0 會指定以 BEGIN_MSG_MAP 宣告的預設訊息對應。 若要使用以 ALT_MSG_MAP(msgMapID) 宣告的替代訊息對應,請傳遞 msgMapID

hWndParent
[in]父視窗或擁有者視窗的句柄。

rect
[in] 指定視窗位置的 RECT 結構。 RECT可以透過指標或傳址方式傳遞 。

szWindowName
[in]指定視窗的名稱。 預設值是 NULL。

dwStyle
[in]窗口的樣式。 預設值是 WS_CHILD | WS_VISIBLE。 如需可能值的清單,請參閱 Windows SDK 中的 CreateWindow

dwExStyle
[in]延伸窗口樣式。 默認值為 0,表示沒有延伸樣式。 如需可能值的清單,請參閱 Windows SDK 中的 CreateWindowEx

MenuOrID
[in]如果是子視窗,則為視窗標識符。 針對最上層視窗,視窗的功能表句柄。 預設值為 0U

lpCreateParam
[in]視窗建立數據的指標。 如需完整描述,請參閱 CreateWindowEx 的最終參數描述。

傳回值

如果成功,則為新建立視窗的句柄;否則為 NULL。

備註

現有的視窗類別名稱會儲存在m_lpszClassNameCreate 然後根據這個新類別建立視窗。 新建立的視窗會自動附加至 CContainedWindowT 物件。

注意

如果您已經呼叫 SubclassWindow,請勿呼叫 。Create

注意

如果使用 0 作為 MenuOrID 參數的值,則必須將它指定為 0U(預設值),以避免編譯程式錯誤。

CContainedWindowT::D efWindowProc

WindowProc 呼叫以處理訊息對應未處理的訊息。

LRESULT DefWindowProc()
LRESULT DefWindowProc(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

參數

uMsg
[in]傳送至視窗的訊息。

wParam
[in]其他訊息特定資訊。

lParam
[in]其他訊息特定資訊。

傳回值

訊息處理的結果。

備註

根據預設,DefWindowProc呼叫 CallWindowProc Win32 函式,將訊息資訊傳送至m_pfnSuperWindowProc中指定的視窗程式。

CContainedWindowT::GetCurrentMessage

傳回目前的訊息 (m_pCurrentMsg)。

const _ATL_MSG* GetCurrentMessage();

傳回值

目前訊息,封裝在結構中 MSG

CContainedWindowT::m_dwMsgMapID

保留目前用於自主視窗之訊息對應的標識碼。

DWORD m_dwMsgMapID;

備註

此訊息對應必須在包含的物件中宣告。

BEGIN_MSG_MAP 宣告的預設訊息對應一律以零識別。 以 ALT_MSG_MAP(msgMapID) 宣告的替代訊息對應是由識別msgMapID

m_dwMsgMapID 會先由建構函式初始化,而且可以藉由呼叫 SwitchMessageMap 來變更。 如需範例,請參閱 CContainedWindowT 概觀

CContainedWindowT::m_lpszClassName

指定現有視窗類別的名稱。

LPTSTR m_lpszClassName;

備註

當您建立視窗時, Create 會註冊以這個現有類別為基礎的新窗口類別,但使用 CContainedWindowT::WindowProc

m_lpszClassName 由建構函式初始化。 如需範例,請參閱 CContainedWindowT 概觀。

CContainedWindowT::m_pfnSuperWindowProc

如果包含的視窗已子類別化, m_pfnSuperWindowProc 則指向視窗類別的原始視窗程式。

WNDPROC m_pfnSuperWindowProc;

備註

如果包含的視窗已超類別化,表示它是以修改現有類別的視窗類別為基礎, m_pfnSuperWindowProc 指向現有的視窗類別視窗程式。

DefWindowProc 方法會將訊息資訊傳送至儲存在 中的m_pfnSuperWindowProc視窗程式。

CContainedWindowT::m_pObject

指向包含 CContainedWindowT 物件的物件。

CMessageMap* m_pObject;

備註

此容器的類別必須衍生自 CMessageMap,並宣告自主視窗所使用的訊息對應。

m_pObject 由建構函式初始化。 如需範例,請參閱 CContainedWindowT 概觀。

CContainedWindowT::RegisterWndSuperclass

Create 呼叫以註冊自主視窗的窗口類別。

ATOM RegisterWndSuperClass();

傳回值

如果成功,則為可唯一識別所註冊窗口類別的 Atom;否則為零。

備註

此視窗類別是以現有的類別為基礎,但使用 CContainedWindowT::WindowProc。 現有的視窗類別名稱和視窗程序會分別儲存在 m_lpszClassNamem_pfnSuperWindowProc中。

CContainedWindowT::SubclassWindow

子類別化 hWnd識別的視窗,並將它附加至 CContainedWindowT 物件。

BOOL SubclassWindow(HWND hWnd);

參數

hWnd
[in]要子類別化之視窗的句柄。

傳回值

如果視窗已成功子類別化,則為TRUE;否則為 FALSE。

備註

子類別化窗口現在使用 CContainedWindowT::WindowProc。 原始視窗程式會儲存在 m_pfnSuperWindowProc中。

注意

如果您已經呼叫 Create,請勿呼叫 。SubclassWindow

CContainedWindowT::SwitchMessageMap

變更將用來處理自主視窗訊息的訊息對應。

void SwitchMessageMap(DWORD dwMsgMapID);

參數

dwMsgMapID
[in]訊息對應標識碼。 若要使用以 BEGIN_MSG_MAP 宣告的預設訊息對應,請傳遞零。 若要使用以 ALT_MSG_MAP(msgMapID) 宣告的替代訊息對應,請傳遞 msgMapID

備註

訊息對應必須在包含的物件中定義。

您一開始會在建構函式中指定訊息對應識別碼。

CContainedWindowT::UnsubclassWindow

將子類別化視窗與 CContainedWindowT 物件中斷連結,並還原儲存在 m_pfnSuperWindowProc的原始視窗程式。

HWND UnsubclassWindow(BOOL bForce = FALSE);

參數

bForce
[in]設定為TRUE,強制還原原始窗口程式,即使此 CContainedWindowT 對象的視窗程式目前不是使用中也一樣。 如果 bForce 設定為 FALSE,且此 CContainedWindowT 物件的視窗程式目前不是使用中,則不會還原原始視窗程式。

傳回值

先前子類別化之視窗的句柄。 如果 bForce 設定為 FALSE,且此 CContainedWindowT 對象的視窗程式目前不是使用中,則會傳回 NULL。

備註

只有在您想要在窗口終結之前還原原始窗口程式時,才使用這個方法。 否則,當窗口終結時, WindowProc 會自動執行此動作。

CContainedWindowT::WindowProc

這個靜態方法會實作窗口程式。

static LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

參數

hWnd
[in]視窗的句柄。

uMsg
[in]傳送至視窗的訊息。

wParam
[in]其他訊息特定資訊。

lParam
[in]其他訊息特定資訊。

傳回值

訊息處理的結果。

備註

WindowProc將訊息導向m_dwMsgMapID識別的訊息對應。 如有必要, WindowProc 請呼叫 DefWindowProc 以處理其他訊息。

另請參閱

CWindow 類別
CWindowImpl 類別
CMessageMap 類別
BEGIN_MSG_MAP
ALT_MSG_MAP(msgMapID)
類別概觀