ATL3.0中的窗口类
2006-07-22 22:53:41 来源:WEB开发网不幸的是,CWindow类不能让我们自己决定窗口如何响应消息。当然,我们可以使用CWindow类提供的方法来使一个窗口居中或隐藏,甚至可以向一个窗口发送消息,但是当窗口收到消息后怎么处理则取决于创建这个窗口时使用的窗口类,如果我们是创建的是”button”类的窗口,那么它的表现就象个按钮,如果用”listbox”类创建,那它就具有跟列表框相同的行为,使用CWindow类我们没有办法改变这点。幸好,ATL为我们提供了另外一个类CWindowImpl,它允许我们指定窗口的新行为。
CWindowImpl:
CWindowImpl类是从CWindow类派生的,所以我们依然可以使用CWindow类中的成员函数,但是CWindowImpl类的功能更强大,它允许我们指定窗口怎样处理消息。在传统的窗口编程中,如果我们要处理窗口消息,我们必须使用窗口函数;但是使用ATL,我们只需要在我们的ATL窗口类中定义一个消息映射。
首先,从CWindowImpl类派生自己的窗口类,如下: class CMyWindow : public CWindowImpl
注意,我们自己的类名必须作为一个模版参数传递给CWindowImpl类。
{
然后在类的定义里面定义如下的消息映射: BEGIN_MSG_MAP(CMyWindow)
下面这句
MESSAGE_HANDLER(WM_PAINT,OnPaint)
MESSAGE_HANDLER(WM_CREATE,OnCreate)
MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
END_MSG_MAP()MESSAGE_HANDLER(WM_PAINT,OnPaint)
的意思是,当WM_PAINT消息到达时,将调用CMyWindow::OnPaint成员函数。
最后就是定义处理消息的函数了,如下: LRESULT OnPaint(
这些函数中的参数意义为:第一个是消息ID,中间的两个参数的意义取决于消息类型,第四个参数是一个标志,用它来决定这个消息是已经处理完了还是需要进一步的处理。关于这些参数,我们在Message Map小结有更详细的讨论。
UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{ ...
}
LRESULT OnCreate(
UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{ ...
}
LRESULT OnDestroy(
UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{ ...
}
}; // CmyWindow
更多精彩
赞助商链接