WTL也发布了最新版,提供了一些vista界面的模板,对c++程序员有一个好消息!


 

负责 Windows ® Template Library (WTL) 的开发人员最近发布了最新版本,这个模板库非常优秀,完全支持随 Windows Vista ® 引入的几乎所有新用户界面功能和增强功能。本月,我将重点介绍此最新版本中的一些新功能。如果您尚不熟悉 WTL 以及它与 Visual C++ ® 开发领域之间的适应情况,我在开头将简单地加以介绍。

 

为了能够轻松创建 COM 客户端和服务器,同时尽可能生成最小、最快的代码,Visual C++ 团队开发了活动模板库 (ATL)。与 MFC 不同,ATL 从设计之初就支持 COM 开发,并且做得很好;而 MFC 注重开发用户界面应用程序,仅在后期添加了对 COM 的支持。ATL 只支持基本的用户界面开发,但它提供的类可用作更高级的用户界面库的轻型构建块和基类,其作用非同小可。

WTL 对 ATL 进行了扩展,提供了大量用于构建应用程序的类模板,您想有多简单就有多简单,想有多复杂就有多复杂。WTL 并未随 Visual C++ 提供,但可以通过 SourceForge 网站 sourceforge.net/projects/wtl 和 Microsoft 下载中心获取。

WTL 8.0 的主要开发重点是 Windows Vista UI 支持,所以我会谈及我在前几期专栏和文章中讨论的一些主题。不过,本月的重点是 WTL 的最新改进如何促进对这些新功能的采用,并确保进一步减少需要您亲自编写的代码!《MSDN® 杂志》网站提供此专栏的下载,下载内容中提供了本文介绍的大多数功能的示例。


任务对话框

任务对话框是 Windows Vista 中我最喜爱的新功能之一,它提供了功能强大的 API,只凭少许努力便可开发出简单对话框和高级对话框。

TaskDialogIndirect 函数和 TASKDIALOGCONFIG 结构可能令人生畏,确实需要借助 C++ 的一些帮助来简化其使用。WTL 通过 CTaskDialogImpl 基类模板提供对任务对话框的支持。CTaskDialogImpl 类在内部使用 CTaskDialogConfig 类来封装 TASKDIALOGCONFIG 结构。如果需要直接访问该结构,可以通过公共变量 m_tdc 进行访问,但您不太可能需要它,因为 CTaskDialogImpl 类提供的相应成员函数已将其打包,这一点做得非常出色。另外提供的还有从 CTaskDialogImpl 派生的 CTaskDialog 具体类,用于十分简单的情形,但一般情况下,最好从 CTaskDialogImpl 派生一个类来实现任务对话框。

图 1 展示了一些任务对话框功能以及如何在 WTL 中利用它们。该示例设置了窗口标题、主要说明和内容文本说明。任务对话框支持多个附加的文本说明,但需要根据是否已构造任务对话框来采用不同的机制设置这些文本说明。遗憾的是,CTaskDialogImpl 类没有概括出这些不同之处,使得更新这些文本说明有点令人迷惑。图 2 根据文本说明是在构造任务对话框之前还是之后设置的,概括介绍了如何使用 CTaskDialogImpl 类来设置各种文本说明。更新这些说明的常用方法是,在任务对话框的构造函数中使用预构造方法,而在各种事件处理程序中使用后构造方法。

图 1 任务对话框示例
图 1  任务对话框示例

图 1 中的代码还利用了 ModifyFlags 方法。Windows SDK 中记录了各种标记,可用于自定义任务对话框的外观。ModifyFlags 方法的第一个参数表示要删除的标记,第二个参数表示要添加的标记。还使用了 SetButtons 方法来指定将在任务对话框中显示的按钮。示例中将 TASKDIALOG_BUTTON 结构数组声明为静态,以确保它的存储在构造函数之外仍然有效。这十分重要,因为稍后调用 DoModal 方法时会引用该按钮定义,最终将所有信息传递给 TaskDialogIndirect 函数,从而真正地显示任务对话框。

调用 DoModal 方法是相当简明的,还可以选择提供用户选择的按钮标识符。图 3 显示了如何显示图 1 中的任务对话框以及如何处理各种按钮标识符的示例。

或者也可以使用 CTaskDialogImpl 类通过一组公共方法公开的任务对话框的回调功能。您可以在派生类中有选择地实现这些方法,以处理不同的事件。例如,为了在对话框类中处理按钮单击事件,可以添加图 4 中所示的公共方法。

当您想要处理特定的按钮单击而不一定要关闭任务对话框时,处理此事件特别有用。可以采用类似方法进行处理的其他事件还有很多。图 5 显示了 CTaskDialogImpl 类提供的一系列覆盖。请记住,这些都是 ATL 风格的覆盖,都在编译时进行求值,所以它们不需要调用虚拟函数。

任务对话框提供了更多的功能。本专栏的示例代码提供了一组全面的示例,充分展示了借助于 WTL 的任务对话框的全部功能。如需详细了解任务对话框 API 的各方面功能,请阅读我的博客文章“Windows Vista for Developers–Part 2–Task Dialogs in Depth”(weblogs.asp.net/kennykerr/archive/2006/07/18/Windows-Vista-for-Developers-_1320_-Part-2-_1320_-Task-Dialogs-in-Depth.aspx)。

Back to top

Aero 向导

Windows Vista 为通用向导引入了一个时尚的新外观。AeroTM 向导采用与旧向导相同的标准,只是对属性表 API 做了一些更改。这样就可以使得更新应用程序以利用新的用户界面变得十分简单。WTL 提供了一组封装了所有新功能的类模板,从而使更新变得更加简单。

只需从 CAeroWizardFrameImpl 类模板派生向导窗口类,该类就会自行应用适当的标记,指示 Windows 使用新的 Aero 用户界面。CAeroWizardFrameImpl 从提供所有常用功能的 CPropertySheetImpl 派生而来。向导页面直接从 CAeroWizardPageImpl 类派生而来,该类提供了用于控制新的 Aero 向导按钮的方法。图 6 提供了一个简单但完整的单页面 Aero 向导示例。

图 6 简单的 Aero 向导
图 6  简单的 Aero 向导

您可以看到,没有太多需要说明的新东西,转移到 Aero 向导相当简单。主要任务将是管理对 Aero 向导起修饰作用的标准按钮。该示例演示了 ShowWizardButtons、EnableWizardButtons 和 SetButtonText 方法。ShowWizardButtons 显示或隐藏一个或多个按钮。第一个参数表示要对其执行操作的按钮,第二个参数表示这些按钮中要显示的按钮。同样,EnableWizardButtons 的第一个参数表示要对其执行操作的按钮,第二个参数表示这些按钮中要启用的按钮。其余按钮将被禁用。最后,SetButtonText 负责更新 Next、Finish 和 Cancel 按钮的文本说明。

Back to top

新的文件对话框

Windows Vista 提供的新文件对话框呈现出与新的 Windows 资源管理器用户界面协调一致的新颖外观,对于使用多年而有些过时的 GetOpenFileName 和 GetSaveFileName 函数来说,这是一项受欢迎的更新。新的文件对话框通过一组 COM 接口公开,所以直接使用它们并不太难。然而,每次需要弹出文件对话框时都要编写相同的样板 COM 代码确实令人乏味,尤其是需要对各种要求提供 COM 接口实现的文件对话框事件作出响应时。幸运的是,WTL 将其打包在了一组易于使用的类中,这一点确实不错。图 7 提供了一个“文件打开”对话框实现示例。

图 7 “文件打开”对话框
图 7  “文件打开”对话框 (单击该图像获得较大视图)

与 GetOpenFileName 使用的多字符串方法相比,COMDLG_FILTERSPEC 结构提供了一种更易于管理的格式来指定文件类型。随后将这些结构的数组传递给 SetFileTypes 方法,以指定需要对话框筛选的文件类型。GetPtr 方法返回对话框的 IFileOpenDialog 接口指针,用于自定义对话框的外观和行为。

新的文件对话框还允许您响应各种事件。不过,需要实现 IFileDialogEvents 接口才能接收这些事件。幸运的是,WTL 已通过 CShellFileDialogImpl 基类模板实现了此接口,所以,您只需为感兴趣的事件提供处理程序即可。

图 8 显示了 CShellFileDialogImpl 类提供的一系列覆盖。例如,您可能希望在关闭“文件打开”对话框之前确认所选文件是否可接受。这很容易实现,只需在对话框即将返回结果前调用 OnFileOk 事件即可,如果您确定所选文件不可接受,则可以通过阻止对话框关闭来实现。图 9 中的示例说明了这一方法。

最后,可以按如下方法使用“文件打开”对话框:

 

SampleOpenDialog dialog;

if (IDOK == dialog.DoModal())
{
    CString filePath;
    COM_VERIFY(dialog.GetFilePath(filePath));

    // Use file here...
}

 

新的文件对话框通过各种 COM 接口提供了更多功能。如需详细了解新的文件对话框 API 提供的诸多功能,请阅读我的博客文章“Windows Vista for Developers–Part 6–The New File Dialogs”(weblogs.asp.net/kennykerr/archive/2006/11/10/Windows-Vista-for-Developers-_1320_-Part-6-_1320_-The-New-File-Dialogs.aspx)。

Back to top

有待探索的其他 WTL 功能

在以前的“借助 C++ 进行 Windows 开发”专栏中,我介绍了 Windows Vista 中的很多控件增强功能 (msdn.microsoft.com/msdnmag/issues/07/08/WindowsCPP)。现在,WTL 通过更新过的类和宏封装了几乎所有新功能,以便处理新的消息和通知。最新版本的 WTL 甚至还有更多吸引人之处,从对可调整大小对话框支持方面的改进、新的选项卡视图类到其他许多有用的新增功能和改进功能。花几分钟的时间探索一下 WTL 标题。如果您刚接触 WTL,则会对这个适用于 Windows 的优秀 C++ 库的简约设计和功能强大的类感到惊喜。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值