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
[入力] メッセージ固有の追加情報。

戻り値

メッセージ処理の結果。

解説

既定では、DefWindowProcCallWindowProc 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
[入力] サブクラス化されているウィンドウへのハンドル。

戻り値

ウィンドウが正常にサブクラス化された場合は 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 によって識別されるメッセージ マップにメッセージを送信します。 必要に応じて、WindowProcDefWindowProc を呼び出して、追加のメッセージ処理を行います。

関連項目

CWindow クラス
CWindowImpl クラス
CMessageMap クラス
BEGIN_MSG_MAP
ALT_MSG_MAP(msgMapID)
クラスの概要