爱生活、爱佳维

--细节决定成败,技术成就梦想
   ::  ::  ::  ::  :: 管理

[翻译]CTaskDialog:新的可供选择的消息框!

Posted on 2008-12-07 20:01 牧云人 阅读(661) 评论(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


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理