次の方法で共有


メッセージ マップの派生

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

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

Diagram showing the hierarchy of a view.
履歴の表示

クラスの CMyView のメッセージ マップでメッセージを一致できない場合、フレームワークはその直接の基底クラスのメッセージ マップも検索します。 メッセージ マップの最初の BEGIN_MESSAGE_MAP マクロは、その引数として 2 つのクラス名を指定します。

BEGIN_MESSAGE_MAP(CMyView, CView)

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

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

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

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

関連項目

フレームワークのメッセージ マップ検索方法