次の方法で共有


標準 Windows メッセージのハンドラー

標準の Windows メッセージ (WM_) の既定のハンドラーは、クラス CWndで事前に定義されています。 クラス ライブラリは、これらのハンドラーの名前をメッセージ名に基づいて定義します。 たとえば、WM_PAINT メッセージのハンドラーは、CWndで次のように宣言されます。

afx_msg void OnPaint();

afx_msg キーワードは、ハンドラーを他のvirtualメンバー関数と区別することで、C++ CWnd キーワードの効果を示します。 ただし、これらの関数は実際には仮想的ではないことに注意してください。代わりに、メッセージ マップを使用して実装されます。 メッセージ マップは、C++ 言語の拡張機能ではなく、標準のプリプロセッサ マクロのみに依存します。 afx_msg キーワードは、前処理後は空白に解決されます。

基底クラスで定義されているハンドラーをオーバーライドするには、派生クラスで同じプロトタイプを持つ関数を定義し、ハンドラーのメッセージ マップ エントリを作成するだけです。 ハンドラーは、クラスの基底クラスのいずれかで、同じ名前のハンドラーを "オーバーライド" します。

場合によっては、基底クラスと Windows がメッセージを操作できるように、ハンドラーが基底クラスでオーバーライドされたハンドラーを呼び出す必要があります。 オーバーライドで基底クラス ハンドラーを呼び出す場所は、状況によって異なります。 基底クラス ハンドラーを最初に呼び出す必要があり、最後に呼び出す必要がある場合があります。 メッセージを自分で処理しないことを選択した場合は、基底クラス ハンドラーを条件付きで呼び出すことがあります。 場合によっては、基底クラス ハンドラーによって返される値または状態に応じて、基底クラス ハンドラーを呼び出し、独自のハンドラー コードを条件付きで実行する必要があります。

注意事項

基底クラス ハンドラーに渡す場合は、ハンドラーに渡される引数を変更しても安全ではありません。 たとえば、 ハンドラーの OnChar 引数を変更したくなる場合があります (たとえば、大文字に変換します)。 この動作はかなりあいまいですが、この効果を達成する必要がある場合は、代わりに CWnd メンバー関数 SendMessage 使用してください。

特定のメッセージをオーバーライドする適切な方法をどのように判断しますか。クラス ウィザードは、特定のメッセージに対するハンドラー関数 (たとえば、OnCreate に対する ハンドラー) のスケルトンを記述するときに、推奨される、オーバーライドされるメンバー関数の形式で概要を設計します。 次の例では、ハンドラーが最初に基底クラス ハンドラーを呼び出し、-1 を返さない条件でのみ続行することをお勧めします。

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here

   return 0;
}

慣例により、これらのハンドラーの名前はプレフィックス "On" で始まります。これらのハンドラーの中には引数を受け取っていないものもあれば、いくつかを受け取るものもあります。 一部には、 void以外の戻り値の型もあります。 すべてのWM_メッセージの既定のハンドラーは、名前が "On" で始まるクラス のメンバー関数として CWndに記載されています。CWndのメンバー関数宣言には、プレフィックスとして afx_msg が付けられます

こちらも参照ください

メッセージ ハンドラー関数の宣言