本演练介绍了CTaskDialog 类,并演示如何添加这个到应用程序。
CTaskDialog 为替换在 Windows Vista的窗口消息对话框的任务对话框。 CTaskDialog 提高原始消息对话框并添加功能。 Windows 消息框仍受Visual Studio支持。
备注
早于 Windows Vista的Windows 版本不支持 CTaskDialog。如果希望查看运行在 Windows 的早期生成的应用程序的用户消息,必须编写其他对话框选项的程序。您可以使用静态方法 CTaskDialog::IsSupported 确定在运行时,用户计算机是否能查看 CTaskDialog。此外,当应用程序使用 Unicode库生成时,CTaskDialog 才可用。
CTaskDialog 支持多种可选元素,收集并显示信息。 例如,CTaskDialog 可以显示命令链接、自定义按钮的、自定义图标和页脚。 CTaskDialog 也具有可查询任务对话框状态的多种方法以确定用户选择的可选元素。
系统必备
你需要以下组件来完成本演练:
Visual Studio 2010
Windows Vista
用CTaskDialog替换Windows消息框窗口。
以下过程演示了 CTaskDialog的最基本使用,这将替换 Windows 消息框。 此示例还更改了与任务对话框关联的图标。 更改图标,使 CTaskDialog 显示为相同的 Windows 消息框。
用CTaskDialog替换Windows消息框窗口。
创建具有默认设置的 MFC 应用程序项目。 命名为 MyProject。
使用 解决方案资源管理器 打开文件 MyProject.cpp。
在列表后面添加 #include "afxtaskdialog.h"。
查找CMyProjectApp::InitInstance 方法。 在 return TRUE; 语句之前插入下面的代码行。 此代码创建我们使用在 Windows 消息框或 CTaskDialog中的字符串。
CString message("My message to the user"); CString dialogTitle("My Task Dialog title"); CString emptyString;
在步骤4代码之后添加以下代码。 本代码能保证用户计算机来支持 CTaskDialog。 如果对话框不支持,应用程序将显示一个 Windows 消息框。
if (CTaskDialog::IsSupported()) { } else { AfxMessageBox(message); }
在从步骤 5 中的 if 语句后插入括号之间的代码。 此代码创建 CTaskDialog。
CTaskDialog taskDialog(message, emptyString, dialogTitle, TDCBF_OK_BUTTON);
在下一行上,添加以下代码。 此代码设置警告图标。
taskDialog.SetMainIcon(TD_WARNING_ICON);
在下一行上,添加以下代码。 此代码显示一个任务对话框。
taskDialog.DoModal();
如果不希望 CTaskDialog 显示和 Windows 消息框相同的图标,可以忽略第 7 步。 如果省略该步骤,当应用程序显示它时,CTaskDialog 没有图标。
编译并运行应用程序。 在启动后,应用程序显示一个任务对话框。
在CTaskDialog上添加功能。
以下过程向您演示如何添加功能到您在前面的过程中创建的 CTaskDialog。 示例代码演示如何执行基于用户选择的特定指令。
向CTaskDialog添加功能
导航到 资源视图。 如果看不到 资源视图,可以从 视图 菜单打开它。
展开 资源视图,直到能够选择 字符串表 文件夹。 展开并双击 字符串表输入。
滚动到字符串表的底部并添加一个新项。 将ID更改为 TEMP_LINE1。 设置标题为命令行 1。
添加另一个新项。 将ID更改为 TEMP_LINE2。 设置标题为命令行 2。
导航回到 MyProject.cpp。
在 CString emptyString; 之后,添加以下代码:
CString expandedLabel("Hide extra information"); CString collapsedLabel("Show extra information"); CString expansionInfo("This is the additional information to the user,\nextended over two lines.");
查找taskDialog.DoModal()语句,并用以下代码替换。 此代码将更新任务对话框并添加新控件:
taskDialog.SetMainInstruction(L"Warning"); taskDialog.SetCommonButtons(TDCBF_YES_BUTTON | TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON); taskDialog.LoadCommandControls(TEMP_LINE1, TEMP_LINE2); taskDialog.SetExpansionArea(expansionInfo, collapsedLabel, expandedLabel); taskDialog.SetFooterText(L"This is the a small footnote to the user"); taskDialog.SetVerificationCheckboxText(L"Remember your selection");
添加如下显示给用户的任务对话框和检索用户的选择的代码行:
INT_PTR result = taskDialog.DoModal();
调用taskDialog.DoModal() 之后,插入下面的代码。 该代码节处理用户的输入:
if (taskDialog.GetVerificationCheckboxState() ) { // PROCESS IF the user selects the verification checkbox } switch (result) { case TEMP_LINE1: // PROCESS IF the first command line break; case TEMP_LINE2: // PROCESS IF the second command line break; case IDYES: // PROCESS IF the user clicks yes break; case IDNO: // PROCESS IF the user clicks no break; case IDCANCEL: // PROCESS IF the user clicks cancel break; default: // This case should not be hit because closing the dialog box results in IDCANCEL break; }
在步骤 9 的代码中,如果代码要在指定条件下执行,请替换从进程开始的注解。
编译并运行应用程序。 应用程序显示使用新控件和其他信息的任务对话框。
演示 CTaskDialog,无需CTaskDialog 创建对象
以下过程显示如何显示 CTaskDialog,而无需首先创建 CTaskDialog 对象。 本示例继续前面的过程。
要演示 CTaskDialog,无需CTaskDialog 创建对象
如果尚未打开,打开 MyProject.cpp 文件。
导航到 if (CTaskDialog::IsSupported()) 语句的结束括号处。
以便在 if 语句结束括号前面 (在 else 块之前)插入以下代码:
HRESULT result2 = CTaskDialog::ShowDialog(L"My error message", L"Error", L"New Title", TEMP_LINE1, TEMP_LINE2);
编译并运行应用程序。 应用程序显示两个任务对话框。 第一个对话框是来自添加功能到 CTaskDialog 过程;第二个对话框来自上一个过程。
这些示例不演示 CTaskDialog的所有可用选项,但是,可帮助您入门。 有关类的完整说明,请参阅 CTaskDialog 类。