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::WindowProc
。 Create
然後根據這個新的視窗類別建立視窗。 的每個實例 CContainedWindowT
都可以將不同的視窗類別超類別。
CContainedWindowT
也支援視窗子類別化。 SubclassWindow
方法會將現有視窗附加至 CContainedWindowT
物件,並將視窗程序變更至 CContainedWindowT::WindowProc
。 每個 CContainedWindowT
執行個體都可以子類別化為不同的視窗。
注意
針對任何指定的 CContainedWindowT
物件,呼叫 Create
或 SubclassWindow
。 您不應該在同一個物件上叫用這兩種方法。
當您在 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_lpszClassName中。 Create
然後根據這個新類別建立視窗。 新建立的視窗會自動附加至 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_lpszClassName 和 m_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)
類別概觀