Posted on 2008-12-07 20:01
牧云人 阅读(679)
评论(0) 编辑 收藏 引用 所属分类:
C/C++
翻译:viiv(viiv at 163.com)
原文:http://blogs.msdn.com/vcblog/archive/2008/12/04/ctaskdialog-an-alternative-to-the-simple-message-box.aspx
大家好:
首先让我自我介绍一下,我是Lukasz Chodorski,Visual C++ Libraries团队中的一名新软件设计工程师(SDE)。这次我给大家带来的是MFC库中的CTaskDialog消息框类,它包装了一组新的Windows API。CTaskDialog究竟是什么?
它是一个能根据您的需求易于客制化的类/组件。您可以在CTaskDialog中添加如下的元素:
- 窗体的标题
- 应用程序图标
- 应用程序提示
- 内容
- 进度条
- 单选按钮
- 自定义按钮
- 展开/折叠按钮
- 可验证的复选框
- 页脚图标
- 页脚文本
- 普通按钮
正如你所看到的,这里有很多的配置选项可供选择。使用最简单的配置时,它的行为就像一个经典的消息框,但是在更多高级应用中它有进度条,自定义按钮或者单选按钮。它甚至可以在其上设置超链接或是建立简单的向导应用。当然,开发者可以使用MFC通常的执行机制来响应对话框中的事件。
CTaskDialog提供了像往常一样的方法用以创建和初始化控件。例如:
CTaskDialog dlg(_T("A CTaskDialog presents information in a clear and consistent way."),
_T("How much do you like CTaskDialog?"), _T("Sample CTaskDialog"), 0,
TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS , _T("I hope you like it!"));
dlg.AddCommandControl( 10, _T("&Use it!\nIt's the best dialog you can have!"));
dlg.AddCommandControl( 20, _T("&Maybe?\nDon't you want to try it?"));
dlg.AddCommandControl( 25, _T("&No way!\nI'm not going to use it!"));
dlg.AddRadioButton( 3, _T("Lots"));
dlg.AddRadioButton( 7, _T("A little"));
dlg.AddRadioButton( 4, _T("Not at all"));
dlg.SetMainIcon(TD_SHIELD_ICON);
dlg.SetFooterIcon(TD_INFORMATION_ICON);
INT_PTR nResult = dlg.DoModal();
|
它创建了如下样式的窗体:
或者您也可以使用如下的函数进行创建:
INT_PTR nResult = CTaskDialog::ShowDialog(
_T("Don't spend to much time on code, write only one line and get your CTaskDialog!"),
_T("Where do you like to go?"),
_T("One line command"), IDS_RADIO_START, IDS_RADIO_START + 3, TDCBF_CANCEL_BUTTON);
|
注意这些新特性在Windows Vista系统才被引入,所以在编程时需要将_WIN32_WINNT宏定义为0x0600(标识Windows Vista)或更高。
当然,在targetver.h文件中默认值已经为Windows Vista。您应该注意到Windows提供了两个comctl32.dll库(版本5.x.x.x和6.x.x.x)。CTaskDialog需要版本6.x.x.x或更高,所以VC10需要在manifest文件中加入该配置。
当您运行时得到这样的错误:"不能定位xxx在动态链接库COMCTL32.DLL中"。这意味着您的操作系统在运行应用程序时使用了错误的动态链接库,通常是由于在manifest文件中使用了错误的assemblies配置(外部设置或内部设置中的一个)。
强制让Windows使用适合版本的动态库的方法是将如下的配置段加入到manifest文件中:
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
|
由于版本低于Windows Vista的操作系统不支持TaskDialog的API,所以您需要使用CTaskDialog::IsSupported()方法来检查是否可以使用CTaskDialog对话框。通常是这样的结构:
if (CTaskDialog::IsSupported())
{
... //call CTaskDialog
}
else MessageBox(); //调用经典的消息对话框
|
这里描述的特性是微软预发布软件Visual Studio 2010及.NET Framework 4.0社区技术预览版(CTP)中的一部分,您可以通过如下的网址进行下载和体验:http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814
这个使用了CTaskDialog的样例工程被放置在了Visual Studio 2010的样例文件夹中,希望通过这些介绍您能积极的使用CTaskDialog,同时欢迎您的反馈信息
谢谢!
Lukasz