メッセージ処理中に、クラス独自のメッセージ マップをチェックすることは、メッセージ マップ ストーリーの最後ではありません。 クラス CMyView
( CView
から派生) にメッセージに一致するエントリがない場合はどうなりますか?
CView
の基底クラスであるCMyView
は、CWnd
から順に派生します。 したがって、CView
であり、CWnd
。 これらの各クラスには、独自のメッセージ マップがあります。 次の図は、クラスの階層関係を示していますが、 CMyView
オブジェクトは、3 つのクラスすべての特性を持つ単一のオブジェクトであることに注意してください。
履歴の表示
クラス CMyView
のメッセージ マップでメッセージを照合できない場合、フレームワークは、その即時基底クラスのメッセージ マップも検索します。 メッセージ マップの先頭にある BEGIN_MESSAGE_MAP
マクロは、2 つのクラス名を引数として指定します。
BEGIN_MESSAGE_MAP(CMyView, CView)
最初の引数は、メッセージ マップが属するクラスに名前を付けます。 2 番目の引数は、フレームワークがメッセージ マップを検索できるように、即時基底クラス (この場合は CView
) との接続を提供します。
したがって、基底クラスで提供されるメッセージ ハンドラーは、派生クラスによって継承されます。 これは、すべてのハンドラー メンバー関数を仮想にする必要なく、通常の仮想メンバー関数とよく似ています。
基底クラスのメッセージ マップにハンドラーが見つからない場合は、メッセージの既定の処理が実行されます。 メッセージがコマンドの場合、フレームワークはそれを次のコマンド ターゲットにルーティングします。 標準の Windows メッセージの場合、メッセージは適切な既定のウィンドウ プロシージャに渡されます。
メッセージ マップの照合を高速化するために、フレームワークは、同じメッセージを再び受信する可能性が高い最近の一致をキャッシュします。 この結果の 1 つは、フレームワークが未処理のメッセージを非常に効率的に処理することです。 また、メッセージ マップは、仮想関数を使用する実装よりもスペース効率が高くなります。