WTL体系结构(4)
WTL体系结构
对话框
ATL的对话框支持一向很好,对此WTL新增了通用对话框的封装. 本质上是为对话框加入了输入验证和回调函数. 比如, 你想在用户改变年Open对话框中的文件夹时有所动作,那么你应该从CFileDialogImpl<>继承一个类,实现OnFolderChange():
class CMyFileDialog : public CFileDialogImpl<CMyFileDialog>
{
public:
CMyFileDialog(BOOL b)
: CFileDialogImpl<CMyFileDialog>(b) { }
void OnFolderChange(LPOFNOTIFY lpon)
{
char strFolder[MAX_PATH];
if (GetFolderPath(strFolder, sizeof(strFolder)) > 0)
{
MessageBox(strFolder);
}
}
};
当文件夹的路径改变时,CFileDialogImpl<>调用OnFolderChange().该函数使用基类的GetFolderPath(),来取得新路径.
控件
WTL为所有的Win32和通用控件提供了封装类,包括Windows 2000新加入的. 虽然只是简单的包装,但是它们使这些控件更加容易访问.譬如,你能记清楚从List View读出当前选定项的文字的消息和需要传的参数吗?(实际上, 你需要发送两个消息, 一个是得到选定项的索引,另一个是读出它的文字.) WTL的作者为你完成了这些烦人的工作, 提供了一个简单的封装函数供你使用.
使用这些控件类有两种方法. 如果你的对话框里有一个控件, 你可以将控件的HWND依附到一个封装对象,使用封装类的方法来访问控件.这种方法简化了你读写控件数据和处理notification消息的代码.
另外的用法是把这些类加到你的视图类的继承层次中去:
class CMyView : public CWindowImpl<CMyView, CListBox>
这表示CWindowImpl<>是从CListBox继承而来,因此创建的窗口将是一个list box (因为窗口类的名字是通过调用
CListBox::GetWndClassName()得到的). 另外, ATL的窗口机制会子类化这个窗口,将发给它的消息路由到你的消息映射中去. 它保留了老的窗口函数,这样,你没有处理的消息将由老的窗口函数来处理.当你的视图类从控件类继承时,WTL就会使用这一技术.
在notification消息和子类化这个主题上,有一点很值得指出,那就是当某事件发生时,绝大多数窗口控件都会发送notification消息给它们的父窗口.让你窗口来处理这些notification消息要比子类化一个已存在控件窗口(或子类化一个已存在的类,然后建立一个实例),从而在控件之前取得消息好得多. 譬如, 你想处理按钮的click事件,你所需要做的只是处理BN_CLICKED notification.它将由按钮发送给你的窗口类.另外的一种方法是从CContainedWindow<>子类化BUTTON窗口来处理click消息.
我之所以说这个是因为一个知名的ATL鼓吹者给我一份代码里就是这么做的.他的代码取得一个简单的按钮click事件所花的时间是别人的3到4倍,因为他子类化了按钮控件,而不是简单的处理BN_CLICKED notification.
WTL还提供了一些新的控件,在win32中没有对等者. 你已经看到过一个 -- command bar, 实际上还有其他一些非常有用类:
| 类 | 描述 |
| CBitmapButton | 这是一个用位图替代标题的按钮.你可以提供一个image list,里边包含按钮在正常状态,失效, 推入和鼠标落在按钮上的图表. |
| CHyperLink | 让你建立一个static控件,它代表一个hyperlink,这样当用户点击它时,默认的web浏览器打开该链接. |
| CWaitCursor | 这不过是在它的构造函数中把鼠标图标改成等待状态,而在析构函数中还原. |
| CCheckListViewCtrl | 在每一项边上都有一个check box的list box. |
| CMultiPaneStatusBarCtrl | 具有多个pane的状态条 |
(未完待续)
- · 数据结构学习(C++)——递归【1】
- · 数据结构学习(C++)——递归【2】(1)
- · 数据结构学习(C++)——递归【2】(2)
- · 数据结构学习(C++)——递归【2】(3)
- · 数据结构学习(C++)——递归【2】(4)
- · 关于异常的使用心得
- · 在VC中调用DirectShow全屏播放视频
- · 3D图形渲染通道负载优化的几种方法
- · 数据结构学习(C++)——递归【3】(1)
- · 旧爱如梦 (harrymeng旧书推荐)
- · ESMTP身份验证机制探索手记
- · 数据结构学习(C++)——递归【3】(2)
- · “扫雷”游戏的幕后
- · vc dll编程
- · Visual C++ 6.0的文档/视结构
- · VC增加自定义消息
- · 和GUI有关的各种对象
- · 文档 视图 框架窗口间的关系和消息传送规律
- · 线程
- · 特权提升
- · “瑜珈山夜话” ---- 闲谈“封装与抽象”
- · 用DEF文件从DLL中导出C++类
- · “瑜珈山夜话”--- 寻根究底谈“继承”(一)
- · 软件解密技术研究
- · “瑜珈山夜话”--- 参考资料
- · 写扫雷的一点感想(初学的朋友可以看看)
- · 运用VC或Java对Office进行编程操作
- · 可以动态读入系统所支持的数据库
- · 向你的程序中添加多语言支持
- · 计算24点
- · DSP应用实例(一)--轻松实现BT多点下载
- · DirectShow应用程序设计介绍(翻译)
- · 一个俄罗斯方块游戏源程序
- · 数据结构学习(C++)——二叉树【1】
- · 闲侃名家名作
- · 在编程中调用OLEDB的数据连接属性对话框
- · JIURL玩玩Win2k内存篇 Page Frame Number Database
- · JIURL玩玩Win2k内存篇 LookasideList
