实现具有CWindowImpl的窗口
若要实现窗口中,从 CWindowImpl派生选件类。 在派生类中,声明消息映射和消息处理函数。 您可以通过三种不同的方法现在可以使用您的选件类:
创建基于新的Windows选件类的窗口
创建超类时现有Windows选件类
子类现有的窗口
创建基于新的Windows选件类的窗口
CWindowImpl 包含 DECLARE_WND_CLASS 宏声明Windows选件类信息。 此宏实现 GetWndClassInfo 功能,使用 CWndClassInfo 定义新的Windows选件类的信息。 当 CWindowImpl::Create 调用时,此Windows选件类中,并且新的窗口中创建。
备注
CWindowImpl 通过 NULL 到 DECLARE_WND_CLASS 宏,这意味着ATL将生成一个Windows类名。若要指定自己的名称,请传递字符串对 CWindowImpl的 DECLARE_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的原始窗口过程。