メッセージ マップの派生
メッセージの処理は、クラスのメッセージ マップのチェックだけではありません。 CMyView クラス (CView 派生クラス) のメッセージ マップにメッセージに対応するエントリが見つからなかった場合の処理も必要です。
CMyView の基本クラス CView は、CWnd の派生クラスです。 したがって、CMyView は CView でもあり CWnd でもあります。 これらの基本クラスも、それぞれ固有のメッセージ マップを持っています。 各クラスの階層関係を下の図「階層図」に示します。CMyView オブジェクトは、単一のオブジェクトで、3 つのクラスの特性を兼ね備えています。
階層図
CMyView クラスのメッセージ マップを検索してメッセージが見つからないと、直接基本クラスのメッセージ マップが検索されます。 メッセージ マップの先頭の BEGIN_MESSAGE_MAP マクロは、2 つのクラスを引数として持っています。
BEGIN_MESSAGE_MAP(CMyView, CFormView)
最初の引数は、メッセージ マップが所属するクラス名です。 2 番目の引数は、そのクラスの直接基本クラスの名前 (ここでは CView) です。これによって、フレームワークは基本クラスのメッセージ マップも検索できます。
基本クラスのメッセージ ハンドラーは派生クラスに継承されます。 これは、通常の仮想メンバー関数によく似ていますが、すべてのハンドラー メンバー関数を仮想関数として宣言する必要はありません。
どの基本クラスのメッセージ マップにもハンドラーが見つからないと、既定のメッセージ処理が実行されます。 メッセージがコマンドのときは、フレームワークは次のコマンド ターゲットにメッセージを送ります。 メッセージが標準 Windows メッセージのときは、該当する既定のウィンドウ プロシージャにメッセージを送ります。
メッセージ マップの検索を高速化するために、フレームワークは、最近検索した結果をキャッシュします。この結果、同じメッセージが再度発生したときの処理が高速化されます。 これによって、フレームワークは未処理メッセージを効率よく処理できます。 また、メッセージ マップによる機構は、仮想関数を使った実装よりもメモリ効率がよくなります。