ATL3.0中的窗口类
2006-07-22 22:53:41 来源:WEB开发网(译者注:我觉得这种方法不太合乎C++的思想,基类的编写者不一定总能知道派生自它的类会有哪些需求,而且把所有不同的版本都在基类中实现,基类中无用的代码量会大大增加。更好的办法应该是把基类中的消息处理函数声明为虚函数。总之,我觉得这一小节并不能体现出可选消息映射的真正用途。)
其它类型的链:
除了基类消息映射链,ATL也提供了成员链(member chaining)和动态链(dynamic chaining),这些很少使用到的链技术超出了我们这篇文章的讨论范围,但是可以简单提一下。成员链允许把消息映射链接到一个类的成员变量,动态链允许在运行时进行动态链接。如果你想了解更多,请参考ATL文档中的CHAIN_MSG_MAP_DYNAMIC 和CHAIN_MSG_MAP_MEMBER的相关内容。
窗口的超类化:
超类化定义一个类,并为预定义的窗口类(如按钮类或列表框类)添加新的功能,下面的例子超类化一个按钮,让这个按钮在被单击的时候发出蜂鸣。 class CBeepButton: public CWindowImpl< CBeepButton >
DECLARE_WND_SUPERCLASS宏声明了这个窗口的类名(“BeepButton”)和被超类化的类名(“Button”)。它的消息映射表只有一个入口项,将WM_LBUTTONDOWN消息映射到OnLButtonDown函数。其余的消息都让默认的窗口过程处理,除了可以发出蜂鸣外,CbeepButton需要和其它的按钮表现相同,因此在OnLButtonDown函数的最后,需要将bHandled设置为FALSE,让默认的窗口过程在OnLButtonDown函数完成后对WM_LBUTTONDOWN消息进行其它的处理。(另外的一种方法是直接调用DefWindowProc函数。)
{
public:
DECLARE_WND_SUPERCLASS( _T("BeepButton"), _T("Button") )
BEGIN_MSG_MAP( CBeepButton )
MESSAGE_HANDLER( WM_LBUTTONDOWN, OnLButtonDown )
END_MSG_MAP()
LRESULT OnLButtonDown( UINT, WPARAM, LPARAM, BOOL& bHandled )
{
MessageBeep( MB_ICONASTERISK );
bHandled = FALSE; // alternatively: DefWindowProc()
return 0;
}
}; // CBeepButton
更多精彩
赞助商链接