标准Windows消息的处理程序

标准 windows 消息的 (WM_) 默认处理程序在类 CWnd预定义。 类库根据名称这些处理程序邮件名。 例如, WM_PAINT 消息的处理程序在 CWnd 声明如下所示:

afx_msg void OnPaint();

afx_msg 关键字通过区分处理程序建议 C++ 虚拟 关键字的效果与其他 CWnd 成员函数。 然而,请注意,这些函数实际上不是虚拟的;它们通过消息映射中实现。 消息映射仅取决于标准预处理器宏,而所有扩展到 C++ 语言。 afx_msg 关键字解析为空白在预处理后。

若要重写基类中定义的处理程序中,定义具有相同原型的函数在派生类并进行处理程序的消息映射项。 您的处理程序 “重写”相同名称的任何处理程序中的任何您的类的基类。

有时,您的处理程序应调用基类的重写处理程序,使基类和 windows 能对消息。 其中是您调用您的重写的基类处理程序依赖于情况。 有时必须先有时最后调用基类的处理程序。 在某些情况下,如果选择不处理消息,则有条件地调用基类的处理程序。 有时您应调用基类的处理程序,然后按条件基于的基类处理程序或状态执行您的处理程序代码,返回的值。

警告

因此,如果您希望传递给基类的处理程序,修改传递到处理程序是不安全的。例如,您可能会诱惑修改 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_ 消息的默认处理程序在 MFC 引用 文档,作为名称以 “启动类 CWnd 的成员函数”。在 CWnd 的成员函数声明的前缀。 afx_msg

请参见

概念

声明消息处理函数