ATL3.0中的窗口类
2006-07-22 22:53:41 来源:WEB开发网另外一种可选的方法:我们也可以让这个编辑框成为一个被包含的窗口,所有发送到这个编辑框的消息都会经过它的容器窗口;我们可以在这个容器窗口中为这个被包含的窗口实现特殊的消息处理。
最后的一种方法就是消息反射,当一个窗口收到一个消息后不处理它,而是反射给发送这个消息的窗口自己处理,这种技术可以用来创建自包含的控件。
基类消息链(Base Class Chaining):
如果我们已经有一些实现了特定功能的ATL窗口类,我们可以从它们派生新类以充分利用继承的优点。比如: class CBase: public CWindowImpl< CBase >
可是,上面的代码有一个问题。当我们在调试模式下运行这个程序,一个窗口出现了,如果我们在这个窗口中单击,“button down”将出现在输出窗口中,这是CDrived类的功能,可是,当我们关闭这个窗口的时候,程序并不退出,尽管CBase类处理了WM_DESTROY消息并且CDrived类是从CBase类派生的。
// simple base window class: shuts down app when closed
{
BEGIN_MSG_MAP( CBase )
MESSAGE_HANDLER( WM_DESTROY, OnDestroy )
END_MSG_MAP()
LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& )
{
PostQuitMessage( 0 );
return 0;
}
};
class CDerived: public CBase
// derived from CBase; handles mouse button events
{
BEGIN_MSG_MAP( CDerived )
MESSAGE_HANDLER( WM_LBUTTONDOWN, OnButtonDown )
END_MSG_MAP()
LRESULT OnButtonDown( UINT, WPARAM, LPARAM, BOOL& )
{
ATLTRACE( "button down\n" );
return 0;
}
};
// in WinMain():
...
CDerived win;
win.Create( NULL, CWindow::rcDefault, "derived window" );
更多精彩
赞助商链接