演练:向应用程序添加 CTaskDialog
本演练介绍了 CTaskDialog Class ,并演示如何将其添加到应用程序中。
CTaskDialog
是一个任务对话框,用于取代 Windows Vista 或更高版本中的 Windows 消息框。 CTaskDialog
改进了原始消息框并添加了功能。 Visual Studio 中仍支持 Windows 消息框。
注意
早于 Windows Vista 的 Windows 版本不支持 CTaskDialog
。 如果你想要向在早期版本的 Windows 上运行你的应用程序的用户显示一条消息,则必须编写备用对话框选项的程序。 可以使用静态方法 CTaskDialog::IsSupported 在运行时确定用户的计算机能否显示 CTaskDialog
中的 Windows 消息框。 此外,仅当应用程序使用 Unicode 库生成时, CTaskDialog
才可用。
CTaskDialog
支持使用多种可选元素来收集和显示信息。 例如, CTaskDialog
可以显示命令链接、自定义按钮、自定义图标和页脚。 CTaskDialog
还具有多种方法,可查询任务对话框状态以确定用户选择的可选元素。
先决条件
你需要满足以下条件才能完成本演练:
Visual Studio 2010 或更高版本
Windows Vista 或更高版本
将 Windows 消息框替换为 CTaskDialog
以下过程演示了将要替换 Windows 消息框的 CTaskDialog
最基本的用法。 此示例还更改了与任务对话框关联的图标。 更改该图标会使 CTaskDialog
的外观与 Windows 消息框相同。
将 Windows 消息框替换为 CTaskDialog 的步骤
使用“MFC 应用程序向导”创建具有所有默认设置的 MFC 应用程序。 有关如何为 Visual Studio 版本打开向导的说明,请参阅演练:使用新的 MFC Shell 控件。
将它命名为 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
。 将标题设置为 Command Line 1。再添加一个新条目。 将 ID 更改为
TEMP_LINE2
。 将标题设置为 Command Line 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 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 的代码中,将以 PROCESS IF
开头的注释替换为要在指定条件下执行的代码。
编译并运行该应用程序。 应用程序将显示使用新控件和其他信息的任务对话框。
显示 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 Class 。