CContainedWindowT クラス
このクラスは、別のオブジェクト内に含まれるウィンドウを実装します。
重要
このクラスとそのメンバーは、Windows ランタイムで実行するアプリケーションで使用することはできません。
構文
template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class CContainedWindowT : public TBase
パラメーター
TBase
新しいクラスの基底クラス。 既定の基底クラスは CWindow
です。
TWinTraits
ウィンドウのスタイルを定義する traits クラス。 既定値は、CControlWinTraits
です。
Note
CContainedWindow は、CContainedWindowT
を特殊化したものです。 基底クラスまたは特徴を変更する場合は、CContainedWindowT
を直接使用してください。
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CContainedWindowT::CContainedWindowT | コンストラクターです。 格納されているウィンドウのメッセージを処理するメッセージ マップを指定するために、データ メンバーを初期化します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CContainedWindowT::Create | ウィンドウを作成します。 |
CContainedWindowT::DefWindowProc | 既定のメッセージ処理を提供します。 |
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
's window プロシージャは、包含オブジェクト内のメッセージ マップを使用して、適切なハンドラーにメッセージを転送します。 CContainedWindowT
オブジェクトを構築するときは、使用するメッセージ マップを指定します。
CContainedWindowT
は既存のウィンドウ クラスをスーパークラス化して、新しいウィンドウを作成できます。 Create
メソッドは、最初に既存のクラスに基づくウィンドウ クラスを登録しますが、CContainedWindowT::WindowProc
を使用します。 Create
は次に、この新しいウィンドウ クラスに基づいてウィンドウを作成します。 CContainedWindowT
の各インスタンスは、別のウィンドウ クラスをスーパークラス化できます。
CContainedWindowT
は、ウィンドウのサブクラス化もサポートします。 SubclassWindow
メソッドは、既存のウィンドウを CContainedWindowT
オブジェクトにアタッチし、ウィンドウ プロシージャを CContainedWindowT::WindowProc
に変更します。 CContainedWindowT
の各インスタンスは、別のウィンドウをサブクラス化できます。
Note
特定の CContainedWindowT
オブジェクトに対して、Create
または SubclassWindow
を呼び出します。 同じオブジェクトで両方のメソッドを呼び出さないでください。
ATL プロジェクト ウィザードの[Add control based on]\(次に基づいてコントロールを追加\) オプションを使用すると、ウィザードによって、コントロールを実装するクラスに 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
[入力] 格納されているウィンドウの基になる既存のウィンドウ クラスの名前。
pObject
[入力] メッセージ マップを宣言する格納しているオブジェクトへのポインター。 このオブジェクトのクラスは、CMessageMap から派生しなければなりません。
dwMsgMapID
[入力] 格納されているウィンドウのメッセージを処理するメッセージ マップを特定します。 既定値は 0 で、BEGIN_MSG_MAP で宣言された既定のメッセージ マップを指定します。 ALT_MSG_MAP(msgMapID) で宣言された代替メッセージ マップを使用するには、msgMapID
を渡します。
解説
Create で新しいウィンドウを作成する場合は、lpszClassNameパラメーターの既存のウィンドウ クラスの名前を渡す必要があります。 例については、CContainedWindow の概要を参照してください。
コンストラクターには次の 3 つがあります。
通常呼び出されるのは、3 つの引数を持つコンストラクターです。
2 つの引数を持つコンストラクターは、
TBase::GetWndClassName
のクラス名を使用します。引数を持たないコンストラクターは、後で引数を指定する場合に使用します。 後で
Create
を呼び出すときに、ウィンドウ クラス名、メッセージ マップ オブジェクト、およびメッセージ マップ ID を指定する必要があります。
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
[入力] 格納されているウィンドウの基になる既存のウィンドウ クラスの名前。
pObject
[入力] メッセージ マップを宣言する格納しているオブジェクトへのポインター。 このオブジェクトのクラスは、CMessageMap から派生しなければなりません。
dwMsgMapID
[入力] 格納されているウィンドウのメッセージを処理するメッセージ マップを特定します。 既定値は 0 で、BEGIN_MSG_MAP で宣言された既定のメッセージ マップを指定します。 ALT_MSG_MAP(msgMapID) で宣言された代替メッセージ マップを使用するには、msgMapID
を渡します。
hWndParent
[入力] 親またはオーナー ウィンドウへのハンドル。
rect
[入力] ウィンドウの位置を指定する RECT 構造体。 RECT
は、ポインターまたは参照渡しによって渡すことができます。
szWindowName
[入力] ウィンドウの名前を指定します。 既定値は NULL です。
dwStyle
[in] ウィンドウのスタイル。 既定値は WS_CHILD | WS_VISIBLE
です。 使用可能な値の一覧については、Windows SDK の CreateWindow に関するページを参照してください。
dwExStyle
[入力] 拡張ウィンドウ スタイル。 既定値は 0 で、拡張スタイルがないことを意味します。 使用可能な値の一覧については、Windows SDK の CreateWindowEx に関するページを参照してください。
MenuOrID
[入力] 子ウィンドウの場合は、ウィンドウ識別子です。 最上位ウィンドウの場合は、ウィンドウのメニュー ハンドル。 既定値は 0U です。
lpCreateParam
[入力] ウィンドウ作成データへのポインター。 詳細については、CreateWindowEx に関する記事の最後のパラメーターの説明を参照してください。
戻り値
成功した場合は、新しく作成されたウィンドウへのハンドル。それ以外の場合は NULL。
解説
既存のウィンドウ クラス名は m_lpszClassName に保存されます。 Create
は次に、この新しいクラスに基づいてウィンドウを作成します。 新しく作成されたウィンドウは、自動的に CContainedWindowT
オブジェクトにアタッチされます。
Note
既に SubclassWindow を呼び出している場合は、Create
を呼び出さないでください。
Note
0 を MenuOrID パラメーターの値として使用する場合は、コンパイラ エラーを回避するために、0U (既定値) として指定する必要があります。
CContainedWindowT::DefWindowProc
メッセージ マップによって処理されないメッセージを処理するため、WindowProc によって呼び出されます。
LRESULT DefWindowProc()
LRESULT DefWindowProc(
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
パラメーター
uMsg
[入力] ウィンドウに送信されたメッセージ。
wParam
[入力] メッセージ固有の追加情報。
lParam
[入力] メッセージ固有の追加情報。
戻り値
メッセージ処理の結果。
解説
既定では、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
[入力] サブクラス化されているウィンドウへのハンドル。
戻り値
ウィンドウが正常にサブクラス化された場合は TRUE。それ以外の場合は FALSE。
解説
サブクラス化されたウィンドウで CContainedWindowT::WindowProc が使用されるようになりました。 元のウィンドウ プロシージャは m_pfnSuperWindowProc に保存されます。
Note
既に Create を呼び出している場合は、SubclassWindow
を呼び出さないでください。
CContainedWindowT::SwitchMessageMap
格納されているウィンドウのメッセージを処理するために使用するメッセージ マップを変更します。
void SwitchMessageMap(DWORD dwMsgMapID);
パラメーター
dwMsgMapID
[入力] メッセージ マップの識別子。 BEGIN_MSG_MAP で宣言された既定のメッセージ マップを使用するには、ゼロを渡します。 ALT_MSG_MAP(msgMapID) で宣言された代替メッセージ マップを使用するには、msgMapID
を渡します。
解説
メッセージ マップは格納しているオブジェクトで宣言する必要があります。
最初に、コンストラクターでメッセージ マップ識別子を指定します。
CContainedWindowT::UnsubclassWindow
サブクラス化されたウィンドウを CContainedWindowT
オブジェクトからデタッチし、m_pfnSuperWindowProc に保存された元のウィンドウ プロシージャを復元します。
HWND UnsubclassWindow(BOOL bForce = FALSE);
パラメーター
bForce
[入力] この CContainedWindowT
オブジェクトのウィンドウ プロシージャが現在アクティブではない場合でも、元のウィンドウ プロシージャを強制的に復元するには、TRUE に設定します。 bForce が FALSE に設定され、この CContainedWindowT
オブジェクトのウィンドウ プロシージャが現在アクティブではない場合、元のウィンドウ プロシージャは復元されません。
戻り値
以前にサブクラス化されたウィンドウへのハンドル。 bForce が FALSE に設定され、この CContainedWindowT
オブジェクトのウィンドウ プロシージャが現在アクティブではない場合、NULL が返されます。
解説
このメソッドは、ウィンドウが破棄される前に元のウィンドウ プロシージャを復元する場合にのみ使用します。 それ以外の場合、WindowProc はウィンドウが破棄されるときに自動的にこれを行います。
CContainedWindowT::WindowProc
この静的メソッドは、ウィンドウ プロシージャを実装します。
static LRESULT CALLBACK WindowProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
パラメーター
hWnd
[入力] ウィンドウへのハンドル。
uMsg
[入力] ウィンドウに送信されたメッセージ。
wParam
[入力] メッセージ固有の追加情報。
lParam
[入力] メッセージ固有の追加情報。
戻り値
メッセージ処理の結果。
解説
WindowProc
は、m_dwMsgMapID によって識別されるメッセージ マップにメッセージを送信します。 必要に応じて、WindowProc
は DefWindowProc を呼び出して、追加のメッセージ処理を行います。
関連項目
CWindow クラス
CWindowImpl クラス
CMessageMap クラス
BEGIN_MSG_MAP
ALT_MSG_MAP(msgMapID)
クラスの概要