WEB开发网
开发学院软件开发VC ATL3.0中的窗口类 阅读

ATL3.0中的窗口类

 2006-07-22 22:53:41 来源:WEB开发网   
核心提示: (译者注:我觉得这种方法不太合乎C++的思想,基类的编写者不一定总能知道派生自它的类会有哪些需求,ATL3.0中的窗口类(10),而且把所有不同的版本都在基类中实现,基类中无用的代码量会大大增加,需要将bHandled设置为FALSE,让默认的窗口过程在OnLButtonDown函数完成后

(译者注:我觉得这种方法不太合乎C++的思想,基类的编写者不一定总能知道派生自它的类会有哪些需求,而且把所有不同的版本都在基类中实现,基类中无用的代码量会大大增加。更好的办法应该是把基类中的消息处理函数声明为虚函数。总之,我觉得这一小节并不能体现出可选消息映射的真正用途。)

其它类型的链:

除了基类消息映射链,ATL也提供了成员链(member chaining)和动态链(dynamic chaining),这些很少使用到的链技术超出了我们这篇文章的讨论范围,但是可以简单提一下。成员链允许把消息映射链接到一个类的成员变量,动态链允许在运行时进行动态链接。如果你想了解更多,请参考ATL文档中的CHAIN_MSG_MAP_DYNAMIC 和CHAIN_MSG_MAP_MEMBER的相关内容。

窗口的超类化:

超类化定义一个类,并为预定义的窗口类(如按钮类或列表框类)添加新的功能,下面的例子超类化一个按钮,让这个按钮在被单击的时候发出蜂鸣。 class CBeepButton: public CWindowImpl< CBeepButton >
{
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
DECLARE_WND_SUPERCLASS宏声明了这个窗口的类名(“BeepButton”)和被超类化的类名(“Button”)。它的消息映射表只有一个入口项,将WM_LBUTTONDOWN消息映射到OnLButtonDown函数。其余的消息都让默认的窗口过程处理,除了可以发出蜂鸣外,CbeepButton需要和其它的按钮表现相同,因此在OnLButtonDown函数的最后,需要将bHandled设置为FALSE,让默认的窗口过程在OnLButtonDown函数完成后对WM_LBUTTONDOWN消息进行其它的处理。(另外的一种方法是直接调用DefWindowProc函数。)

上一页  5 6 7 8 9 10 

Tags:ATL 窗口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接