メッセージ マップの派生
メッセージ処理中に、クラスは独自のメッセージ マップをチェックすると、メッセージマップ ストーリーの最後ではありません。クラス CMyView に CView(から派生)メッセージに一致するエントリがない場合はどうなりますか。
その CViewの CMyViewの基本クラスに、順番に取得されます CWndから注意してください。したがって CMyViewは CViewで、CWndです 。これらのクラスのそれぞれに独自のメッセージ マップがあります。図は、 「」クラス階層の階層関係を示しますが、 CMyView のオブジェクトが 3 つすべてのクラスの特性を持つ一つのオブジェクトであることに注意します。
階層
したがって、メッセージがクラスの entity_CODECMyView のメッセージ マップに一致する場合は、フレームワークは、直接の基本クラスにメッセージ マップを取得します。メッセージ マップの開始時に BEGIN_MESSAGE_MAP のマクロは、引数として 2 個のクラス名を指定します:
BEGIN_MESSAGE_MAP(CMyView, CFormView)
最初の引数名メッセージ マップが属するクラス。2 番目の引数は、次の直接の基本クラス — CView との接続を提供します。したがって、フレームワークがメッセージ マップを取得できます。
基本クラスで提供されるメッセージ ハンドラーは派生クラスによって継承されます。これは、すべてのハンドラー メンバー関数を仮想にする必要がなく通常の仮想メンバー関数によく似ています。
ハンドラーが基本クラスのメッセージ マップにない場合、メッセージの既定の処理が実行されます。コマンド メッセージがの場合、フレームワークは次のコマンドのターゲットにファイルのパスを指定します。これは標準のウィンドウのメッセージの場合、メッセージは、適切な既定のウィンドウ プロシージャに渡されます。
一致するメッセージマップを簡単にするために、フレームワークは同じメッセージを再度発生確率の最近の一致をキャッシュします。これは、次の 1 とおりの結果は、フレームワークが処理されないメッセージをより効率的に処理します。メッセージ マップも仮想関数を使用して実装領域よりも効率的です。