实现具有CWindowImpl的窗口

若要实现窗口中,从 CWindowImpl派生选件类。 在派生类中,声明消息映射和消息处理函数。 您可以通过三种不同的方法现在可以使用您的选件类:

  • 创建基于新的Windows选件类的窗口

  • 创建超类时现有Windows选件类

  • 子类现有的窗口

创建基于新的Windows选件类的窗口

CWindowImpl 包含 DECLARE_WND_CLASS 宏声明Windows选件类信息。 此宏实现 GetWndClassInfo 功能,使用 CWndClassInfo 定义新的Windows选件类的信息。 当 CWindowImpl::Create 调用时,此Windows选件类中,并且新的窗口中创建。

备注

CWindowImpl 通过 NULLDECLARE_WND_CLASS 宏,这意味着ATL将生成一个Windows类名。若要指定自己的名称,请传递字符串对 CWindowImplDECLARE_WND_CLASS 派生类。

示例

以下实现基于新的Windows选件类的窗口选件类的示例:

class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(_T("MyName")) 
              // If this macro is not specified in your
              // class, ATL will generate a class name

   BEGIN_MSG_MAP(CMyCustomWnd)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()

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

};

若要创建窗口中,将创建 CMyWindow 实例然后调用 Create 方法。

备注

若要重写默认Windows选件类信息,请通过设置 CWndClassInfo 成员执行在派生类中 GetWndClassInfo 方法为适当的值。

下面的选件该类的示例显示标准的编辑选件类的创建:

class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
   // "Edit" is the name of the standard Windows class.
   // "MyEdit" is the name of the new Windows class
   // that will be based on the Edit class.
   DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))

   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
   END_MSG_MAP()

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

若要创建要为其创建超类的编辑窗口中,创建 CMyEdit 实例然后调用 Create 方法。

创建超类现有Windows选件类

DECLARE_WND_SUPERCLASS 宏允许您创建承载的窗口创建现有Windows选件类。 指定此宏在您的 CWindowImpl派生类。 与其他ATL窗口中,消息由消息映射处理。

当您使用 DECLARE_WND_SUPERCLASS,新的Windows选件类将注册。 此新选件类将与现有选件类使用 CWindowImpl::WindowProc 指定,但是,替换窗口过程的相同(或重写此方法)的功能。

Subclassing现有的窗口

对子类现有的窗口,从 CWindowImpl 派生选件类并声明消息映射,在前两个大小写。 然而,请注意,您未指定任何Windows选件类信息,因为您将子类一个现有窗口。

而不是调用 Create,请调用 SubclassWindow 并将该句柄所需的子类的现有窗口。 在窗口子类,它将使用 CWindowImpl::WindowProc (或重写此方法)的功能处理消息传送到消息映射。 取消从对象中的一个子类窗口,请调用 UnsubclassWindow。 然后将还原windows的原始窗口过程。

请参见

参考

实现窗口