次の方法で共有


メッセージ マップの派生

メッセージ処理中に、クラス独自のメッセージ マップをチェックすることは、メッセージ マップ ストーリーの最後ではありません。 クラス CMyView ( CView から派生) にメッセージに一致するエントリがない場合はどうなりますか?

CViewの基底クラスであるCMyViewは、CWndから順に派生します。 したがって、CViewであり、CWnd。 これらの各クラスには、独自のメッセージ マップがあります。 次の図は、クラスの階層関係を示していますが、 CMyView オブジェクトは、3 つのクラスすべての特性を持つ単一のオブジェクトであることに注意してください。

ビューの階層を示す図。
履歴の表示

クラス CMyViewのメッセージ マップでメッセージを照合できない場合、フレームワークは、その即時基底クラスのメッセージ マップも検索します。 メッセージ マップの先頭にある BEGIN_MESSAGE_MAP マクロは、2 つのクラス名を引数として指定します。

BEGIN_MESSAGE_MAP(CMyView, CView)

最初の引数は、メッセージ マップが属するクラスに名前を付けます。 2 番目の引数は、フレームワークがメッセージ マップを検索できるように、即時基底クラス (この場合は CView) との接続を提供します。

したがって、基底クラスで提供されるメッセージ ハンドラーは、派生クラスによって継承されます。 これは、すべてのハンドラー メンバー関数を仮想にする必要なく、通常の仮想メンバー関数とよく似ています。

基底クラスのメッセージ マップにハンドラーが見つからない場合は、メッセージの既定の処理が実行されます。 メッセージがコマンドの場合、フレームワークはそれを次のコマンド ターゲットにルーティングします。 標準の Windows メッセージの場合、メッセージは適切な既定のウィンドウ プロシージャに渡されます。

メッセージ マップの照合を高速化するために、フレームワークは、同じメッセージを再び受信する可能性が高い最近の一致をキャッシュします。 この結果の 1 つは、フレームワークが未処理のメッセージを非常に効率的に処理することです。 また、メッセージ マップは、仮想関数を使用する実装よりもスペース効率が高くなります。

こちらも参照ください

フレームワークがメッセージ マップを検索する方法