メッセージ マップ (ATL)

メッセージ マップは、ハンドラー関数を特定のメッセージ、コマンド、または通知に関連付けます。 ATL のメッセージ マップ マクロを使用して、ウィンドウのメッセージ マップを指定できます。 CWindowImplCDialogImpl、および CContainedWindowT のウィンドウ プロシージャは、ウィンドウのメッセージをメッセージ マップに送信します。

メッセージ ハンドラー関数には、型 BOOL& の追加の引数を指定できます。 この引数は、メッセージが処理されたかどうかを示すもので、既定では TRUE に設定されます。 ハンドラー関数は、メッセージを処理していないことを示すために、引数を FALSE に設定できます。 この場合、ATL はメッセージ マップ内でさらにハンドラー関数を探し続けます。 この引数を FALSE に設定することで、メッセージに応答して最初に何らかのアクションを実行した後で、既定の処理または別のハンドラー関数でメッセージの処理を完了することができます。

チェーンされたメッセージ マップ

ATL では、メッセージ マップをチェーンして、別のクラスに定義されたメッセージ マップにメッセージの処理を送信することもできます。 たとえば、別のクラスに共通メッセージ処理を実装して、そのクラスにチェーンするすべてのウィンドウで統一の動作を提供できます。 チェーンできるのは、基底クラスまたは使用するクラスのデータ メンバーです。

ATL では、動的なチェーンもサポートされています。これにより、実行時に別のオブジェクトのメッセージ マップにチェーンすることができます。 動的なチェーンを実装するには、クラスを CDynamicChain から派生させる必要があります。 次に、メッセージ マップで CHAIN_MSG_MAP_DYNAMIC マクロを宣言します。 CHAIN_MSG_MAP_DYNAMIC では、オブジェクトを識別する一意の番号と、チェーンする対象のメッセージ マップが必要です。 この一意の値は、CDynamicChain::SetChainEntry への呼び出しを使用して定義する必要があります。

クラスが CMessageMap から派生していれば、メッセージ マップを宣言する任意のクラスにチェーンできます。 CMessageMap を使用すると、オブジェクトがそのセージ マップを他のオブジェクトに公開できます。 CWindowImpl は既に CMessageMap から派生していることに注意してください。

代替メッセージ マップ

また、ATL は、ALT_MSG_MAP マクロを使用して宣言された代替メッセージ マップをサポートしています。 各代替メッセージ マップは、ALT_MSG_MAP に渡す一意の番号で識別されます。 代替メッセージ マップを使用すると、複数のウィンドウのメッセージを 1 つのマップで処理できます。 既定では、CWindowImpl は代替メッセージ マップを使用しないことに注意してください。 このサポートを追加するには、CWindowImpl 派生クラスの WindowProc メソッドをオーバーライドし、メッセージップ識別子を使用して ProcessWindowMessage を呼び出します。

関連項目

ウィンドウの実装