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

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

afx_msg void OnPaint();

afx_msg のキーワードは CWnd の他のメンバー関数とハンドラーを区別するために、 C++ 仮想,virtual のキーワードの効果を示します。ただし、これらの関数が実際に仮想でないので注意してください; これらは、メッセージ マップを通じて代わりに実行されます。メッセージ マップは、 C++ 言語で標準プリプロセッサ マクロに、各拡張に依存します。afx_msg のキーワードは NULL にプリプロセス後で解決します。

基本クラスで定義されているハンドラーを派生クラスのプロトタイプと同じ関数をオーバーライドし、ハンドラーのメッセージマップ エントリを行うための単純に定義します。このハンドラーは、クラスの基本クラスの同じ名前のハンドラーを 「オーバーライド」します。

場合によっては、ハンドラーは基本クラスのオーバーライドされたハンドラーを呼び出す必要があります。基本クラスとウィンドウにメッセージがアクティブ化できます。ダイヤルする場合、オーバーライドの基本クラス ハンドラーは状況によって異なります。この基本クラス ハンドラーが最初と最後に、を呼び出します。場合によっては、自分でメッセージを処理しないことを選択した場合は、基本クラス ハンドラーに条件付きで呼び出します。が所有するには、基本クラス ハンドラーに、条件付きで基本クラス ハンドラーが返す値または状態によって、ハンドラー コードを呼び出す必要があります。

Caution メモ注意

基本クラス ハンドラーに渡す場合は、ハンドラーに渡される引数を変更することは危険です。OnChar ハンドラーの nChar の引数を変更するためにたとえば、誘惑される場合があります (大文字に変換するには、たとえば)。この動作は、あいまいで、この効果を実現する必要がある場合 CWnd のメンバー関数 SendMessage を代わりに使用します。

どのように特定のメッセージをオーバーライドする適切な方法を決定しますか。プロパティ ウィンドウは特定のメッセージ — WM_CREATEの OnCreate ハンドラー、たとえば —のハンドラー関数のスケルトンを記述するときに推奨されるオーバーライドされたメンバー関数の形式で決定します。次の例は、という要求のみをことをハンドラーは、最初に基本クラス ハンドラー推奨し、 1 –進みます。

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

   // TODO:  Add your specialized creation code here

   return 0;
}

慣例に基づき、これらのハンドラーの名前はプレフィックス 「」で始まります。そのほか、複数を受け取るが、これらのハンドラーの一部の引数を受け取りません。一部に、 void以外の戻り値の型があります。WM_ のすべてのメッセージの既定のハンドラーで、 「から」で始まるクラス CWnd のメンバー関数として " MFC リファレンス " で説明していますCWnd のメンバー関数の宣言は afx_msgが付けられます。

参照

概念

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