消息映射宏 (ATL)

这些宏定义消息映射和条目。

名称 描述
ALT_MSG_MAP 标记备用消息映射的开始。
BEGIN_MSG_MAP 标记默认消息映射的开始。
CHAIN_MSG_MAP_ALT 链接到基类中的备用消息映射。
CHAIN_MSG_MAP_ALT_MEMBER 链接到类的数据成员中的备用消息映射。
CHAIN_MSG_MAP 链接到基类中的默认消息映射。
CHAIN_MSG_MAP_DYNAMIC 在运行时链接到另一个类中的消息映射。
CHAIN_MSG_MAP_MEMBER 链接到类的数据成员中的默认消息映射。
COMMAND_CODE_HANDLER 根据通知代码将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_HANDLER 根据通知代码和菜单项、控件或快捷键的标识符,将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_ID_HANDLER 根据菜单项、控件或快捷键的标识符,将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_RANGE_CODE_HANDLER 根据通知代码和控制标识符的连续范围,将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_RANGE_HANDLER 根据控制标识符的连续范围,将 WM_COMMAND 消息映射到处理程序函数。
DECLARE_EMPTY_MSG_MAP 实现一个空的消息映射。
DEFAULT_REFLECTION_HANDLER 提供一个默认处理程序,用于未以上述方式处理的反射消息。
END_MSG_MAP 标记消息映射的结束。
FORWARD_NOTIFICATIONS 将通知消息转发到父窗口。
MESSAGE_HANDLER 将 Windows 消息映射到处理程序函数。
MESSAGE_RANGE_HANDLER 将连续范围的 Windows 消息映射到处理程序函数。
NOTIFY_CODE_HANDLER 根据通知代码将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_HANDLER 根据通知代码和控件标识符,将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_ID_HANDLER 根据控件标识符将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_RANGE_CODE_HANDLER 根据通知代码和控制标识符的连续范围,将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_RANGE_HANDLER 根据控制标识符的连续范围,将 WM_NOTIFY 消息映射到处理程序函数。
REFLECT_NOTIFICATIONS 将通知消息反射回发送它们的窗口。
REFLECTED_COMMAND_CODE_HANDLER 根据通知代码将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_HANDLER 根据通知代码和菜单项、控件或快捷键的标识符,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_ID_HANDLER 根据菜单项、控件或加速器的标识符,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_RANGE_CODE_HANDLER 根据通知代码和控制标识符的连续范围,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_RANGE_HANDLER 根据控制标识符的连续范围,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_NOTIFY_CODE_HANDLER 根据通知代码,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_HANDLER 根据通知代码和控件标识符,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_ID_HANDLER 根据控件标识符,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_RANGE_CODE_HANDLER 根据通知代码和控制标识符的连续范围,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_RANGE_HANDLER 根据控制标识符的连续范围,将反射的 WM_NOTIFY 消息映射到处理程序函数。

要求

标头:atlwin.h

ALT_MSG_MAP

标记备用消息映射的开始。

ALT_MSG_MAP(msgMapID)

参数

msgMapID
[in] 消息映射标识符。

备注

ATL 通过一个数字标识每个消息映射。 默认消息映射(使用 BEGIN_MSG_MAP 宏声明)由 0 标识。 备用消息映射由 msgMapID 标识。

消息映射用于处理发送到窗口的消息。 例如,CContainedWindow 允许你在包含对象中指定消息映射的标识符。 CContainedWindow::WindowProc 随后使用此消息映射将包含的窗口的消息定向到适当的处理程序函数或定向到另一个消息映射。 有关声明处理程序函数的宏列表,请参阅 BEGIN_MSG_MAP

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以声明后续的备用消息映射。

END_MSG_MAP 宏标记消息映射的结束。 请注意,BEGIN_MSG_MAP 和 END_MSG_MAP 始终只有一个实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

示例

以下示例显示了默认消息映射和一个备用消息映射,每个都包含一个处理程序函数:

BEGIN_MSG_MAP(CMyOneAltClass)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

下一个示例显示了两个备用消息映射。 默认消息映射为空。

BEGIN_MSG_MAP(CMyClass)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
ALT_MSG_MAP(2)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()

要求

标头:atlwin.h

BEGIN_MSG_MAP

标记默认消息映射的开始。

BEGIN_MSG_MAP(theClass)

参数

theClass
[in] 包含消息映射的类的名称。

注解

CWindowImpl::WindowProc 使用默认消息映射来处理发送到窗口的消息。 消息映射将消息定向到适当的处理程序函数或另一个消息映射。

以下宏将消息映射到处理程序函数。 此函数必须在 theClass 中定义。

说明
MESSAGE_HANDLER 将 Windows 消息映射到处理程序函数。
MESSAGE_RANGE_HANDLER 将连续范围的 Windows 消息映射到处理程序函数。
COMMAND_HANDLER 根据通知代码和菜单项、控件或快捷键的标识符,将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_ID_HANDLER 根据菜单项、控件或快捷键的标识符,将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_CODE_HANDLER 根据通知代码将 WM_COMMAND 消息映射到处理程序函数。
COMMAND_RANGE_HANDLER 根据菜单项、控件或加速器的标识符,将连续范围的 WM_COMMAND 消息映射到处理程序函数。
NOTIFY_HANDLER 根据通知代码和控件标识符,将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_ID_HANDLER 根据控件标识符将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_CODE_HANDLER 根据通知代码将 WM_NOTIFY 消息映射到处理程序函数。
NOTIFY_RANGE_HANDLER 根据控件标识符,将连续范围的 WM_NOTIFY 消息映射到处理程序函数。

以下宏将消息定向到另一个消息映射。 这个过程称为“链接”。

说明
CHAIN_MSG_MAP 链接到基类中的默认消息映射。
CHAIN_MSG_MAP_MEMBER 链接到类的数据成员中的默认消息映射。
CHAIN_MSG_MAP_ALT 链接到基类中的备用消息映射。
CHAIN_MSG_MAP_ALT_MEMBER 链接到类的数据成员中的备用消息映射。
CHAIN_MSG_MAP_DYNAMIC 在运行时链接到另一个类中的默认消息映射。

以下宏从父窗口引导“反射”消息。 例如,控件通常会向其父窗口发送通知消息进行处理,但父窗口可以将消息反映回控件。

说明
REFLECTED_COMMAND_HANDLER 根据通知代码和菜单项、控件或快捷键的标识符,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_ID_HANDLER 根据菜单项、控件或加速器的标识符,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_CODE_HANDLER 根据通知代码将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_RANGE_HANDLER 根据控制标识符的连续范围,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_COMMAND_RANGE_CODE_HANDLER 根据通知代码和控制标识符的连续范围,将反射的 WM_COMMAND 消息映射到处理程序函数。
REFLECTED_NOTIFY_HANDLER 根据通知代码和控件标识符,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_ID_HANDLER 根据控件标识符,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_CODE_HANDLER 根据通知代码,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_RANGE_HANDLER 根据控制标识符的连续范围,将反射的 WM_NOTIFY 消息映射到处理程序函数。
REFLECTED_NOTIFY_RANGE_CODE_HANDLER 根据通知代码和控制标识符的连续范围,将反射的 WM_NOTIFY 消息映射到处理程序函数。

示例

class CMyExtWindow : public CMyBaseWindow
{
public:
   BEGIN_MSG_MAP(CMyExtWindow)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
      MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
      CHAIN_MSG_MAP(CMyBaseWindow)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }

   LRESULT OnSetFocus(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/) 
   {
      return 0;   
   }
};

CMyExtWindow 对象收到 WM_PAINT 消息时,该消息被定向到 CMyExtWindow::OnPaint 进行实际处理。 如果 OnPaint 指示消息需要进一步处理,则消息将被定向到 CMyBaseWindow 中的默认消息映射。

除了默认消息映射之外,你还可以使用 ALT_MSG_MAP 定义备用消息映射。 始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以声明后续的备用消息映射。 以下示例显示了默认消息映射和一个备用消息映射,每个都包含一个处理程序函数:

BEGIN_MSG_MAP(CMyOneAltClass)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

下一个示例显示了两个备用消息映射。 默认消息映射为空。

BEGIN_MSG_MAP(CMyClass)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
ALT_MSG_MAP(2)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()

END_MSG_MAP 宏标记消息映射的结束。 请注意,BEGIN_MSG_MAP 和 END_MSG_MAP 始终只有一个实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

要求

标头:atlwin.h

CHAIN_MSG_MAP_ALT

定义消息映射中的条目。

CHAIN_MSG_MAP_ALT(theChainClass, msgMapID)

参数

theChainClass
[in] 包含消息映射的基类的名称。

msgMapID
[in] 消息映射标识符。

备注

CHAIN_MSG_MAP_ALT 将消息定向到基类中的备用消息映射。 你必须使用 ALT_MSG_MAP(msgMapID) 声明此备用消息映射。 要将消息定向到基类的默认消息映射(使用 BEGIN_MSG_MAP 声明),请使用 CHAIN_MSG_MAP。 如需示例,请参阅 CHAIN_MSG_MAP

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

要求

标头:atlwin.h

CHAIN_MSG_MAP_ALT_MEMBER

定义消息映射中的条目。

CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID)

参数

theChainMember
[in] 包含消息映射的数据成员的名称。

msgMapID
[in] 消息映射标识符。

注解

CHAIN_MSG_MAP_ALT_MEMBER 将消息定向到数据成员中的备用消息映射。 你必须使用 ALT_MSG_MAP(msgMapID) 声明此备用消息映射。 要将消息定向到数据成员的默认消息映射(使用 BEGIN_MSG_MAP 声明),请使用 CHAIN_MSG_MAP_MEMBER。 例如,请参阅 CHAIN_MSG_MAP_MEMBER

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

要求

标头:atlwin.h

CHAIN_MSG_MAP

定义消息映射中的条目。

CHAIN_MSG_MAP(theChainClass)

参数

theChainClass
[in] 包含消息映射的基类的名称。

备注

CHAIN_MSG_MAP 将消息定向到基类的默认消息映射(使用 BEGIN_MSG_MAP 声明)。 要将消息定向到基类的备用消息映射(使用 ALT_MSG_MAP 声明),请使用 CHAIN_MSG_MAP_ALT

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

示例

class CMyExtClass : public CMyBaseClass
{
public:
  BEGIN_MSG_MAP(CMyExtClass)
     MESSAGE_HANDLER(WM_PAINT, OnPaint)
     // chain to default message map in CMyBaseClass
     CHAIN_MSG_MAP(CMyBaseClass)
  ALT_MSG_MAP(1)
     // chain to first alternative message map in CMyBaseClass
     CHAIN_MSG_MAP(CMyBaseClass)
  ALT_MSG_MAP(2)
     MESSAGE_HANDLER(WM_CHAR, OnChar)
     // chain to alternate message map in CMyBaseClass
     CHAIN_MSG_MAP_ALT(CMyBaseClass, 1)
  END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
};

此示例说明了以下内容:

  • 如果窗口过程正在使用 CMyClass 的默认消息映射并且 OnPaint 不会处理消息,则将消息定向到 CMyBaseClass 的默认消息映射进行处理。

  • 如果窗口过程使用 CMyClass 中的第一个备用消息映射,则所有消息都被定向到 CMyBaseClass 的默认消息映射。

  • 如果窗口过程正在使用 CMyClass 的第二个备用消息映射并且 OnChar 不处理消息,则消息将被定向到 CMyBaseClass 中指定的备用消息映射。 CMyBaseClass 必须使用 ALT_MSG_MAP(1) 声明此消息映射。

要求

标头:atlwin.h

CHAIN_MSG_MAP_DYNAMIC

定义消息映射中的条目。

CHAIN_MSG_MAP_DYNAMIC(dynaChainID)

参数

dynaChainID
[in] 对象消息映射的唯一标识符。

备注

CHAIN_MSG_MAP_DYNAMIC 在运行时将消息定向到另一个对象中的默认消息映射。 对象及其消息映射与你通过 CDynamicChain::SetChainEntry 定义的 dynaChainID 相关联。 你必须从 CDynamicChain 中派生你的类才能使用 CHAIN_MSG_MAP_DYNAMIC。 有关示例,请参阅 CDynamicChain 概述。

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

要求

标头:atlwin.h

CHAIN_MSG_MAP_MEMBER

定义消息映射中的条目。

CHAIN_MSG_MAP_MEMBER(theChainMember)

参数

theChainMember
[in] 包含消息映射的数据成员的名称。

备注

CHAIN_MSG_MAP_MEMBER 将消息定向到数据成员的默认消息映射(使用 BEGIN_MSG_MAP 声明)。 要将消息定向到数据成员的备用消息映射(使用 ALT_MSG_MAP 声明),请使用 CHAIN_MSG_MAP_ALT_MEMBER

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

示例

class CMyContainerClass : public CWindowImpl<CMyContainerClass>
{
public:
   CMyContainedClass m_obj;

   BEGIN_MSG_MAP(CMyContainerClass)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
      // chain to default message map of m_obj
      CHAIN_MSG_MAP_MEMBER(m_obj)
   ALT_MSG_MAP(1)
      // chain to default message map of m_obj
      CHAIN_MSG_MAP_MEMBER(m_obj)
   ALT_MSG_MAP(2)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
      // chain to alternate message map of m_obj
      CHAIN_MSG_MAP_ALT_MEMBER(m_obj, 1)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
};

此示例说明了以下内容:

  • 如果窗口过程正在使用 CMyClass 的默认消息映射并且 OnPaint 不会处理消息,则将消息定向到 m_obj 的默认消息映射进行处理。

  • 如果窗口过程使用 CMyClass 中的第一个备用消息映射,则所有消息都被定向到 m_obj 的默认消息映射。

  • 如果窗口过程正在使用 CMyClass 的第二个备用消息映射并且 OnChar 不处理消息,则消息将被定向到 m_obj 的指定备用消息映射。 CMyContainedClass 类必须使用 ALT_MSG_MAP(1) 声明此消息映射。

要求

标头:atlwin.h

COMMAND_CODE_HANDLER

类似于 COMMAND_HANDLER,但仅基于通知代码映射 WM_COMMAND 消息。

COMMAND_CODE_HANDLER(code, func)

参数

code
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

COMMAND_HANDLER

定义消息映射中的条目。

COMMAND_HANDLER(id, code, func)

参数

id
[in] 菜单项、控件或加速器的标识符。

code
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

备注

根据通知代码和控件标识符,COMMAND_HANDLER 将 WM_COMMAND 消息映射到指定的处理程序函数。 例如:

class ATL_NO_VTABLE CPolyProp :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CPolyProp, &CLSID_PolyProp>,
   public IPropertyPageImpl<CPolyProp>,
   public CDialogImpl<CPolyProp>
{
public:
BEGIN_COM_MAP(CPolyProp)
   COM_INTERFACE_ENTRY(IPropertyPage)
END_COM_MAP()

BEGIN_MSG_MAP(CPolyProp)
   COMMAND_HANDLER(IDC_SIDES, EN_CHANGE, OnEnChangeSides)
   CHAIN_MSG_MAP(IPropertyPageImpl<CPolyProp>)
END_MSG_MAP()

   // When a CPolyProp object receives a WM_COMMAND message identified 
   // by IDC_SIDES and EN_CHANGE, the message is directed to 
   // CPolyProp::OnEnChangeSides for the actual processing.
   LRESULT OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, 
      BOOL& /*bHandled*/);

在 COMMAND_HANDLER 宏中指定的任何函数都必须定义如下:

LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

在调用 CommandHandler 之前,消息映射将 bHandled 设置为 TRUE。 如果 CommandHandler 未完全处理该消息,则应将 bHandled 设置为 FALSE 以指示该消息需要进一步处理。

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

除了 COMMAND_HANDLER,你还可以使用 MESSAGE_HANDLER 映射 WM_COMMAND 消息,而不考虑标识符或代码。 在这种情况下,MESSAGE_HANDLER(WM_COMMAND, OnHandlerFunction) 会将所有 WM_COMMAND 消息定向到 OnHandlerFunction

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

要求

标头:atlwin.h

COMMAND_ID_HANDLER

类似于 COMMAND_HANDLER,但仅根据菜单项、控件或加速器的标识符映射 WM_COMMAND 消息。

COMMAND_ID_HANDLER(id, func)

参数

id
[in] 发送消息的菜单项、控件或加速器的标识符。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

COMMAND_RANGE_CODE_HANDLER

类似于 COMMAND_RANGE_HANDLER,但将带有特定通知代码的 WM_COMMAND 消息从一系列控件映射到单个处理程序函数。

COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func)

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

code
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

备注

此范围基于发送消息的菜单项、控件或加速器的标识符。

要求

标头:atlwin.h

COMMAND_RANGE_HANDLER

类似于 COMMAND_HANDLER,但将 WM_COMMAND 消息从一系列控件映射到单个处理程序函数。

COMMAND_RANGE_HANDLER( idFirst, idLast, func)

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

func
[in] 消息处理程序函数的名称。

备注

此范围基于发送消息的菜单项、控件或加速器的标识符。

要求

标头:atlwin.h

DECLARE_EMPTY_MSG_MAP

声明一个空的消息映射。

DECLARE_EMPTY_MSG_MAP()

备注

DECLARE_EMPTY_MSG_MAP 是一个方便的宏,其调用宏 BEGIN_MSG_MAPEND_MSG_MAP 来创建一个空的消息映射:

BEGIN_MSG_MAP(CExample)
END_MSG_MAP()

DEFAULT_REFLECTION_HANDLER

为将接收反射消息的子窗口(控件)提供默认处理程序;处理程序将正确地将未处理的消息传递给 DefWindowProc

DEFAULT_REFLECTION_HANDLER()

要求

标头:atlwin.h

END_MSG_MAP

标记消息映射的结束。

END_MSG_MAP()

备注

始终使用 BEGIN_MSG_MAP 宏来标记消息映射的开始。 使用 ALT_MSG_MAP 声明后续的备用消息映射。

请注意,BEGIN_MSG_MAP 和 END_MSG_MAP 始终只有一个实例。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

示例

以下示例显示了默认消息映射和一个备用消息映射,每个都包含一个处理程序函数:

BEGIN_MSG_MAP(CMyOneAltClass)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

下一个示例显示了两个备用消息映射。 默认消息映射为空。

BEGIN_MSG_MAP(CMyClass)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
ALT_MSG_MAP(2)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()

要求

标头:atlwin.h

FORWARD_NOTIFICATIONS

将通知消息转发到父窗口。

FORWARD_NOTIFICATIONS()

注解

将此宏指定为消息映射的一部分。

要求

标头:atlwin.h

MESSAGE_HANDLER

定义消息映射中的条目。

MESSAGE_HANDLER( msg, func )

参数

msg
[in] Windows 消息。

func
[in] 消息处理程序函数的名称。

备注

MESSAGE_HANDLER 将 Windows 消息映射到指定的处理程序函数。

在 MESSAGE_HANDLER 宏中指定的任何函数都必须定义如下:

LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

在调用 MessageHandler 之前,消息映射将 bHandled 设置为 TRUE。 如果 MessageHandler 未完全处理该消息,则应将 bHandled 设置为 FALSE 以指示该消息需要进一步处理。

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

除了 MESSAGE_HANDLER,还可以使用 COMMAND_HANDLERNOTIFY_HANDLER 分别映射 WM_COMMANDWM_NOTIFY 消息。

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

示例

class CMyBaseWindow : public CWindowImpl<CMyBaseWindow>
{
public:
   BEGIN_MSG_MAP(CMyBaseWindow)
      MESSAGE_HANDLER(WM_CREATE, OnCreate)
   END_MSG_MAP()

   // When a CMyBaseWindow object receives a WM_CREATE message, the message
   // is directed to CMyBaseWindow::OnCreate for the actual processing.
   LRESULT OnCreate(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
};

要求

标头:atlwin.h

MESSAGE_RANGE_HANDLER

类似于 MESSAGE_HANDLER,但将一系列 Windows 消息映射到单个处理程序函数。

MESSAGE_RANGE_HANDLER( msgFirst, msgLast, func )

参数

msgFirst
[in] 标记连续消息范围的开始。

msgLast
[in] 标记连续消息范围的结束。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

NOTIFY_CODE_HANDLER

类似于 NOTIFY_HANDLER,但仅基于通知代码映射 WM_NOTIFY 消息。

NOTIFY_CODE_HANDLER(cd, func)

参数

cd
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

NOTIFY_HANDLER

定义消息映射中的条目。

NOTIFY_HANDLER( id, cd, func )

参数

id
[in] 发送消息的控件的标识符。

cd
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

备注

根据通知代码和控件标识符,NOTIFY_HANDLER 将 WM_NOTIFY 消息映射到指定的处理程序函数。

在 NOTIFY_HANDLER 宏中指定的任何函数都必须定义如下:

LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

在调用 NotifyHandler 之前,消息映射将 bHandled 设置为 TRUE。 如果 NotifyHandler 未完全处理该消息,则应将 bHandled 设置为 FALSE 以指示该消息需要进一步处理。

注意

始终以 BEGIN_MSG_MAP 作为消息映射的开头。 然后,你可以使用 ALT_MSG_MAP 声明后续的备用消息映射。 END_MSG_MAP 宏标记消息映射的结束。 每个消息映射必须有一个 BEGIN_MSG_MAP 和 END_MSG_MAP 的实例。

除了 NOTIFY_HANDLER,你还可以使用 MESSAGE_HANDLER 映射 WM_NOTIFY 消息,而不考虑标识符或代码。 在这种情况下,MESSAGE_HANDLER(WM_NOTIFY, OnHandlerFunction) 会将所有 WM_NOTIFY 消息定向到 OnHandlerFunction

有关在 ATL 中使用消息映射的更多信息,请参阅消息映射

示例

class CMyDialog2 : public CDialogImpl<CMyDialog2>
{
public:
   enum { IDD = IDD_MYDLG };

   BEGIN_MSG_MAP(CMyDialog2)
      NOTIFY_HANDLER(IDC_TREE1, NM_CLICK, OnNMClickTree1)
   END_MSG_MAP()

public:
   // When a CMyDialog2 object receives a WM_NOTIFY message 
   // identified by IDC_TREE1 and NM_CLICK, the message is 
   // directed to CMyDialog2::OnNMClickTree1 for the actual
   // processing.
   LRESULT OnNMClickTree1(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/);
};

要求

标头:atlwin.h

NOTIFY_ID_HANDLER

类似于 NOTIFY_HANDLER,但仅基于控件标识符映射 WM_NOTIFY 消息。

NOTIFY_ID_HANDLER( id, func )

参数

id
[in] 发送消息的控件的标识符。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

NOTIFY_RANGE_CODE_HANDLER

类似于 NOTIFY_RANGE_HANDLER,但将带有特定通知代码的 WM_NOTIFY 消息从一系列控件映射到单个处理程序函数。

NOTIFY_RANGE_CODE_HANDLER( idFirst, idLast, cd, func )

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

cd
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

注解

此范围是基于发送消息的控件的标识符。

要求

标头:atlwin.h

NOTIFY_RANGE_HANDLER

类似于 NOTIFY_HANDLER,但将 WM_NOTIFY 消息从一系列控件映射到单个处理程序函数。

NOTIFY_RANGE_HANDLER( idFirst, idLast, func )

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

func
[in] 消息处理程序函数的名称。

注解

此范围是基于发送消息的控件的标识符。

要求

标头:atlwin.h

REFLECT_NOTIFICATIONS

将通知消息反射回发送它们的子窗口(控件)。

REFLECT_NOTIFICATIONS()

备注

将此宏指定为父窗口消息映射的一部分。

要求

标头:atlwin.h

REFLECTED_COMMAND_CODE_HANDLER

类似于 COMMAND_CODE_HANDLER,但映射从父窗口反射的命令。

REFLECTED_COMMAND_CODE_HANDLER( code, func )

参数

code
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_COMMAND_HANDLER

类似于 COMMAND_HANDLER,但映射从父窗口反射的命令。

REFLECTED_COMMAND_HANDLER( id, code, func )

参数

id
[in] 菜单项、控件或加速器的标识符。

code
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_COMMAND_ID_HANDLER

类似于 COMMAND_ID_HANDLER,但映射从父窗口反映的命令。

REFLECTED_COMMAND_ID_HANDLER( id, func )

参数

id
[in] 菜单项、控件或加速器的标识符。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_COMMAND_RANGE_CODE_HANDLER

类似于 COMMAND_RANGE_CODE_HANDLER,但映射从父窗口反射的命令。

REFLECTED_COMMAND_RANGE_CODE_HANDLER( idFirst, idLast, code, func )

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

code
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_COMMAND_RANGE_HANDLER

类似于 COMMAND_RANGE_HANDLER,但映射从父窗口反射的命令。

REFLECTED_COMMAND_RANGE_HANDLER( idFirst, idLast, func )

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_NOTIFY_CODE_HANDLER

类似于 NOTIFY_CODE_HANDLER,但映射从父窗口反射的通知。

REFLECTED_NOTIFY_CODE_HANDLER_EX( cd, func )

参数

cd
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_NOTIFY_HANDLER

类似于 NOTIFY_HANDLER,但映射从父窗口反射的通知。

REFLECTED_NOTIFY_HANDLER( id, cd, func )

参数

id
[in] 菜单项、控件或加速器的标识符。

cd
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_NOTIFY_ID_HANDLER

类似于 NOTIFY_ID_HANDLER,但映射从父窗口反射的通知。

REFLECTED_NOTIFY_ID_HANDLER( id, func )

参数

id
[in] 菜单项、控件或加速器的标识符。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_NOTIFY_RANGE_CODE_HANDLER

类似于 NOTIFY_RANGE_CODE_HANDLER,但映射从父窗口反射的通知。

REFLECTED_NOTIFY_RANGE_CODE_HANDLER( idFirst, idLast, cd, func )

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

cd
[in] 通知代码。

func
[in] 消息处理程序函数的名称。

要求

标头:atlwin.h

REFLECTED_NOTIFY_RANGE_HANDLER

类似于 NOTIFY_RANGE_HANDLER,但映射从父窗口反射的通知。

REFLECTED_NOTIFY_RANGE_HANDLER( idFirst, idLast, func )

参数

idFirst
[in] 标记连续范围的控制标识符的开始。

idLast
[in] 标记连续范围的控制标识符的结束。

func
[in] 消息处理程序函数的名称。

另请参阅