包含ウィンドウの使用
ATL は、CContainedWindowT を使用して包含ウィンドウを実装します。 包含ウィンドウとは、そのメッセージをそれ自体のクラスで処理する代わりに、コンテナー オブジェクトにデリゲートするウィンドウです。
Note
包含ウィンドウを使用するために、CContainedWindowT
からクラスを派生させる必要はありません。
包含ウィンドウでは、既存の Windows クラスをスーパークラス化するか、既存のウィンドウをサブクラス化することができます。 既存の Windows クラスをスーパークラス化するウィンドウを作成するには、まず、CContainedWindowT
オブジェクトのコンストラクターに既存のクラス名を指定します。 次に、CContainedWindowT::Create
を呼び出します。 既存のウィンドウをサブクラス化するには、Windows クラス名を指定する必要はありません (コンストラクターに NULL を渡します)。 サブクラス化するウィンドウへのハンドルを指定して CContainedWindowT::SubclassWindow
メソッドを呼び出すだけです。
通常、包含ウィンドウは、コンテナー クラスのデータ メンバーとして使用します。 このコンテナーはウィンドウである必要はありません。ただし、CMessageMap から派生する必要があります。
包含ウィンドウは、代替メッセージ マップを使用してメッセージを処理できます。 複数の包含ウィンドウがある場合は、それぞれが個別の包含ウィンドウに対応する複数の代替メッセージ マップを宣言する必要があります。
例
次に、2 つの包含ウィンドウを含むコンテナー クラスの例を示します。
class CMyContainer : public CMessageMap
{
public:
CContainedWindow m_wndEdit;
CContainedWindow m_wndList;
CMyContainer() : m_wndEdit(_T("Edit"), this, 1),
m_wndList(_T("List"), this, 2)
{
}
BEGIN_MSG_MAP(CMyContainer)
ALT_MSG_MAP(1)
// handlers for the Edit window go here
ALT_MSG_MAP(2)
// handlers for the List window go here
END_MSG_MAP()
};
包含ウィンドウの詳細については、SUBEDIT のサンプルを参照してください。