メッセージ マップ (ATL)
メッセージ マップは、特定のメッセージ、コマンド、または通知にハンドラー関数を関連付けます。 ATL のメッセージ マップ マクロを使用すると、ウィンドウのメッセージ マップを指定できます。 CWindowImpl、CDialogImpl、および 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 を呼び出します。