使用包含的窗口
ATL 使用 CContainedWindowT 实现包含的窗口。 包含的窗口表示将消息委托给容器对象的窗口,而不是在其自己的类中处理消息。
注意
你无需从 CContainedWindowT
派生类即可使用包含的窗口。
使用包含的窗口,你可以将现有 Windows 类超类化,或将现有窗口子类化。 若要创建一个将现有 Windows 类超类化的窗口,请先在 CContainedWindowT
对象的构造函数中指定现有类名。 然后调用 CContainedWindowT::Create
。 若要对现有窗口子类化,则无需指定 Windows 类名(将 NULL 传递给构造函数)。 只需通过即将子类化的窗口的句柄来调用 CContainedWindowT::SubclassWindow
方法。
通常使用包含的窗口作为容器类的数据成员。 容器不需要是窗口;但必须派生自 CMessageMap。
包含的窗口可以使用备用消息映射来处理其消息。 如果有多个包含窗口,则应声明多个备用消息映射,每个映射对应于单独的包含窗口。
示例
以下是具有两个包含窗口的容器类示例:
class CMyContainer : public CMessageMap
{
public:
CContainedWindow m_wndEdit;
CContainedWindow m_wndList;
CMyContainer() : m_wndEdit(_T("Edit"), this, 1),
m_wndList(_T("List"), this, 2)
{
}
BEGIN_MSG_MAP(CMyContainer)
ALT_MSG_MAP(1)
// handlers for the Edit window go here
ALT_MSG_MAP(2)
// handlers for the List window go here
END_MSG_MAP()
};
有关包含窗口的详细信息,请参阅 SUBEDIT 示例。