次の方法で共有


メッセージ マップの派生

更新 : 2007 年 11 月

メッセージの処理は、クラスのメッセージ マップのチェックだけではありません。CMyView クラス (CView 派生クラス) のメッセージ マップにメッセージに対応するエントリが見つからなかった場合の処理も必要です。

CMyView の基本クラス CView は、CWnd の派生クラスです。したがって、CMyView は CView でもあり CWnd でもあります。これらの基本クラスも、それぞれ固有のメッセージ マップを持っています。各クラスの階層関係を下の図「階層図」に示します。CMyView オブジェクトは、単一のオブジェクトで、3 つのクラスの特性を兼ね備えています。

階層図
VC ビュー階層

CMyView クラスのメッセージ マップを検索してメッセージが見つからないと、直接基本クラスのメッセージ マップが検索されます。メッセージ マップの先頭の BEGIN_MESSAGE_MAP マクロは、2 つのクラスを引数として持っています。

BEGIN_MESSAGE_MAP(CMyView, CFormView)

最初の引数は、メッセージ マップが所属するクラス名です。2 番目の引数は、そのクラスの直接基本クラスの名前 (ここでは CView) です。これによって、フレームワークは基本クラスのメッセージ マップも検索できます。

基本クラスのメッセージ ハンドラは派生クラスに継承されます。これは、通常の仮想メンバ関数によく似ていますが、すべてのハンドラ メンバ関数を仮想関数として宣言する必要はありません。

どの基本クラスのメッセージ マップにもハンドラが見つからないと、既定のメッセージ処理が実行されます。メッセージがコマンドのときは、フレームワークは次のコマンド ターゲットにメッセージを送ります。メッセージが標準 Windows メッセージのときは、該当する既定のウィンドウ プロシージャにメッセージを送ります。

メッセージ マップの検索を高速化するために、フレームワークは、最近検索した結果をキャッシュします。この結果、同じメッセージが再度発生したときの処理が高速化されます。これによって、フレームワークは未処理メッセージを効率よく処理できます。また、メッセージ マップによる機構は、仮想関数を使った実装よりもメモリ効率がよくなります。

参照

概念

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