ATL3.0中的窗口类
2006-07-22 22:53:41 来源:WEB开发网通知消息包含了一个指向消息细节的结构的指针,例如,当一个列表视图控件发送一个通知消息,这个消息就包含了一个指向NMLVDISPINFO结构的指针,所有类似于NMLVDISPINFO的结构都包含一个NMHDR结构的头,pnmh就指向这个头,如果需要访问这种结构中头部以外的其它数据成员,可以将pnmh转化成相应类型的指针。
例如,我们如果要处理列表视图控件发出的LVN_ENDLABELEDIT通知消息,我们可以把下面这行代码放到消息映射表中: NOTIFY_HANDLER( ID_LISTVIEW, LVN_ENDLABELEDIT, OnEndLabelEdit)
这个通知消息附带的额外信息包含在一个NMLVDISPINFO结构中,因此,消息处理函数看起来应该象下面这个样子: LRESULT OnEndLabelEdit(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
可以看出,pnmh指针被转化成NMLVDISPINFO*类型,以便访问头部结构以外的数据。
{
// The item is -1 if editing is being canceled.
if ( ((NMLVDISPINFO*)pnmh)->item.iItem == -1) return FALSE;
...
为现有的窗口类添加功能:
有许多向现有的窗口添加功能的方法。如果这个类是ATL窗口类,我们可以从这个窗口类派生自己的类,就象Base Class Chaining中描述的一样。这种方法主要是一个C++类的继承加上一点消息映射的链接。
如果我们想扩展一个预定义的窗口类(如按纽类或列表框类)的功能,我们可以超类化它。就是创建一个基于这个预定义类的新类,并在消息映射表中添加消息映射以增强它的功能。
有些时候,我们需要改变一个已经存在的窗口实例的行为,而不是一个窗口类——或许我们要让一个对话框上的编辑框做点什么特别的事情。在这种情况下,我们可以写一个新的ATL窗口类,并子类化这个已经存在的编辑框。任何本该发送到这个编辑框的消息都会先被发送到这个子类的对象。
更多精彩
赞助商链接