目录
任务对话框
Aero 向导
新的文件对话框
有待探索的其他 WTL 功能
负责 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 类来设置各种文本说明。更新这些说明的常用方法是,在任务对话框的构造函数中使用预构造方法,而在各种事件处理程序中使用后构造方法。
Figure2更新任务对话框说明
文本说明 | 预构造 | 后构造 |
窗口标题 | SetWindowTitle() | ::SetWindowText() |
主要说明 | SetMainInstructionText() | SetElementText(TDE_MAIN_INSTRUCTION, ... |
具体内容 | SetContentText() | SetElementText(TDE_CONTENT, ... |
脚注 | SetFooterText() | SetElementText(TDE_FOOTER, ... |
展开的信息 | SetExpandedInformationText() | SetElementText(TDE_EXPANDED_INFORMATION, ... |
展开的控件文本 | SetExpandedControlText() | N/A |
折叠的控件文本 | SetCollapsedControlText() | N/A |
验证 | SetVerificationText() | N/A |
Figure1任务对话框示例
enum
{
Button_Save = 101,
Button_DontSave,
};
class SampleDialog : public CTaskDialogImpl<SampleDialog>
{
public:
SampleDialog()
{
SetWindowTitle(L"Title");
SetMainInstructionText(L"Main instruction");
SetContentText(L"Content");
ModifyFlags(0, TDF_ALLOW_DIALOG_CANCELLATION |
TDF_USE_COMMAND_LINKS);
static TASKDIALOG_BUTTON buttons[] =
{
{ Button_Save, L"&Save", },
{ Button_DontSave, L"Do&n't save", },
};
SetButtons(buttons,
_countof(buttons));
}
};
图 1任务对话框示例