用Visual C++ 2010为Windows 7开发应用程序 Ribbon, Task Dialog, Multi-Touch

Visual C++是Visual Studio的开国元老,从Visual Studio诞生的那一天开始,Visual C++就在其中占有非常重要的位置,但是经过Visual Studio 6.0的辉煌之后,特别是微软推出.NET战略之后,Visual C++在整个Visual Studio中的地位逐渐下降,大有江河日下,明日黄花的景象,Visual C++开始逐渐沦为一个“黄脸婆”。

但是,Visual Studio 2010的发布,给Visual C++注入了丰富的时尚元素,让这位“黄脸婆”重新焕发青春:通过对MFC的更新,通过大量新的类的引入,从而可以充分利用最新的操作系统Windows 7的各种新特性,从Ribbon界面到任务栏缩略图,从Task Dialog到Multi-Touch,让我们的应用程序具有Windows 7的“look and feel”。这些时尚元素的注入,让Visual C++重新走在技术发展的最前沿。

为Windows 7开发应用程序

Windows 7的大量新特性

Windows 7已经发布一年多了,从用户的反馈来看,Windows 7无疑是继Windows XP之后又一成功的操作系统,必将逐步取代Windows XP而得到广泛的应用。对于做软件开发的我们来说,我们的目标开发平台也应该随之从Windows XP迁移到Windows 7上来,充分利用这个新操作系统所提供的各种新特性,让我们的应用程序做到“Ready for Windows 7”,具有Windows 7的“look and feel”。如果我们不赶快行动,还是留恋着Windows XP的那种朴素的界面风格,恐怕就要成为奥特曼(out man)了,连走路都不好意思跟人家打招呼,更重要的,我们的用户会不高兴。用户不高兴意味着什么,我想大家都明白。

退一步想,Windows 7为我们提供了这么多新特性,如果我们放着不用,是不是有些浪费?别人会不会笑我们傻:有好东西都不会用!

为了不成为奥特曼,为了让我们的用户高兴,为了不被人笑做傻瓜,立刻马上用Visual C++开发具有Windows 7的“look and feel”的应用程序。

MFC对Windows 7的支持

MFC对Windows 7的支持

很多人都在说MFC老了,过时了,但是这次在Visual C++ 2010中,MFC却获得了一次重大的更新,宛若新生,从而可以更好地支持Windows 7这个新的开发平台。同时,为了支持我们创建具有Windows 7一样的“look and feel”的应用程序,Visual C++对一些工具作了大量的改进,让我们的开发工作可以更加轻松简便。

首先,Visual C++对我们所熟悉的应用程序向导,类向导作了大手术,现在我们可以利用应用程序向导直接创建一个具有Ribbon界面风格的应用程序;通过在应用程序向导中提供丰富的设置选项,我们可以选择所创建的应用程序是否支持Windows 7的任务栏特性,文档搜索等等;通过类向导,我们也可以添加很多对Windows 7新特性提供支持的新类。使用这些新工具,使我们迁移到Windows 7这个新平台轻松又简单。

Ribbon界面

虽然很多用户还在抱怨“不习惯Ribbon界面”、“很多功能找不到位置”等等,但是,随着微软的“强制”推行,Ribbon界面也在越来越被人们所接受,很多应用软件也开始采用Ribbon界面。更重要的是,在Windows 7中,操作系统本身更是大量地应用了Ribbon界面。不管我们愿意或者不愿意,Ribbon界面开始大张旗鼓地攻占我们的软件界面,成为继下拉式菜单后新的标准用户界面。如果我们要开发面向Windows 7的应用程序,我们的应用程序界面也必然要Ribbon化。为了帮助我们尽快实现应用程序界面的Ribbon化,Visual C++ 2010为我们提供了丰富的类和非常直观的Ribbon界面设计器,同时应用程序向导对Ribbon界面提供了原生的支持,我们在创建应用程序的时候,就可以选择是否需要Ribbon界面。

默认的Ribbon界面

Task Dialog

在以往的时代,我们在应用程序中向用户反馈一条消息或者是询问用户下一步操作的时候,大都会采用MessageBox。在MessageBox中,用户就像在法庭上回答律师的提问一样,只能回答YES或者NO,很少会有其他的选择。新引入的Task Dialog改变了这种状态,它不仅可以反馈更丰富的信息给用户,以便用户作出决策;同时还提供了更多的选项给用户选择,可以从用户那里获得更多的信息。这可以在很大程度上提升应用程序的用户体验。同时,Task Dialog的创建也非常简单,例如,我们可以这样来创建一个Task Dialog:

 voidCTaskDialogView::OnTaskdialogShowtaskdialog() { // 创建Task Dialog,设置标题,提示信息等 CTaskDialogdlg(_T("Task Dialog可以为用户提供更多的信息以供决策, \ 同时为用户提供更多的选择。"), _T("喜欢使用Task Dialog吗?"), _T("CTaskDialog实例"), 0, TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS , _T("希望你会喜欢Task Dialog!")); // 添加命令控件 dlg.AddCommandControl( 10, _T("&使用!\n太好了,马上在我的应用程序中使用Task Dialog!")); dlg.AddCommandControl( 20, _T("&可能吧?\n看起来不错,也许我会使用。")); dlg.AddCommandControl( 25, _T("&看看再说。\n我还没有决定呢。")); // 添加单选控件 dlg.AddRadioButton( 3, _T("极大地改善了用户体验!")); dlg.AddRadioButton( 7, _T("有改善,但是并不明显!")); dlg.AddRadioButton( 4, _T("一般般,没有什么变化。")); // 设置图标 dlg.SetMainIcon(TD_SHIELD_ICON); dlg.SetFooterIcon(TD_INFORMATION_ICON); // 显示Task Dialog对话框 INT_PTR nResult = dlg.DoModal(); // 根据用户选择进行处理 if( 10 == nResult ) { // ... } }

如此简单的一段代码,我们就创建了一个内容丰富的 Task Dialog,不仅为用户提供了丰富的信息,还为用户提供了更多的选择,从用户那里获得更多的信息。

改进后的应用程序向导

其次,Windows 7引入了大量新的系统API,通过这些API,我们可以让应用程序充分利用Winodws 7所提供的各种新特性。Visual C++为了避免让我们直接使用Nativie API所带来的繁琐,更加简单高效地实现Windows 7的各种新特性在应用程序中的使用,对MFC类库进行了大量的更新,不仅根据Windows 7重写了部分已有的类,同时新添加了部分新的类。利用这些更新,我们能够方便地为应用程序添加各种新特性,例如Ribbon界面、任务栏缩略图、任务栏跳转表(Jump List)、对Multi-Touch的支持等等。经过Visual C++的一番打扮,我们的应用程序也摩登起来。

全面支持Windows 7的任务栏特性

相信Windows 7的任务栏特性給大家都留下了深刻的印象:现在我们可以通过任务栏对应用程序进行预览;可以通过任务栏了解应用程序的进度;甚至还可以通过任务栏对应用程序进行控制。不过,虽然Windows 7提供了这些新特性,我们的应用程序还要支持这些新特性才行。

那岂不是很麻烦?

不用担心,经更新的MFC已经为我们完成了大部分工作,我们只需要坐享其成就可以了。例如,我们要给应用程序设置一个Overlay图标:

CMainFrame* mainFrm =

dynamic_cast(AfxGetApp()->GetMainWnd());

if (mainFrm)

mainFrm->SetTaskbarOverlayIcon(IDI_ICON_INFO,L"Info");

第一步,获得主框架指针;第二步,调用CMainFrame的新函数SetOverlayIcon()设置图标。事情,就这么简单。

任务栏缩略图是不是很COOL?不需要打开应用程序窗口,就可以看到其中的内容!要想让我们的应用程序也具有这么COOL的新特性更加简单。新版本的MFC对任务栏缩略图提供了原生的支持,我们只需要在创建MFC应用程序的时候,在应用程序中选择“多文档”应用程序类型,同时选择“Tabbed documents”,我们所创建的应用程序就可以支持任务栏的缩略图预览了,甚至不需要我们添加一行代码。

图,任务栏缩略图

Multi-Touch

苹果推出了iPad,一时之间万人空巷;汉王紧跟着推出了山寨之作TouchPad;还有更多的厂商跃跃欲试,都排着队想推出这种没有鼠标和键盘的电脑。没有了鼠标和键盘,应用程序的交互又开始回到了算盘时代:全靠双手十个手指了。

用手指操作应用程序,对我们的应用程序交互方式提出了挑战。哪里有压迫,哪里就有反抗;哪里有挑战,哪里就有应对。为了应对这种交互方式的发展趋势,Visual C++ 2010对Multi-Touch技术提供了完美的支持,让我们可以开发具有下一代应用程序交互技术的应用程序。

凭借着Windows 7对触摸设备的支持,当我们在触摸设备上滑动手指时,Windows 7会发送相应的手指触摸消息给运行在其上的应用程序。默认情况下,Windows 7会发送WM_GESTURE消息给目标窗口,而我们所要做的就是接收这个消息并对相应的手指触摸消息进行处理。在MFC中,它提供了多个可以重写的消息处理函数来对各种手指触摸消息进行处理。

 virtual BOOL OnGestureZoom(CPointptCenter, long lDelta); virtual BOOL OnGesturePan(CPointptFrom, CPointptTo); virtual BOOL OnGestureRotate(CPointptCenter, double dblAngle); virtual BOOL OnGesturePressAndTap(CPointptFirstFinger, long lDelta); virtual BOOL OnGestureTwoFingerTap(CPointptCenter);

图,手势语言:旋转与缩放

MFC对手指触摸消息进行了很好的分类,不同的纷繁复杂的触摸动作被划分成多个具有意义的典型动作。我们所要做的,只是重写某些我们感兴趣的典型动作手指触摸消息处理函数,实现具体的功能就可以了。例如我们可以这样来移动一个物体:

 BOOL CChildView::OnGesturePan(CPointptFrom, CPointptTo) { int dx = ptTo.x - ptFrom.x; intdy = ptTo.y - ptFrom.y; if (dx != 0 || dy != 0) { m_drawingObject.Move(dx, dy); RedrawWindow(); } return TRUE; }

这样,要让我们的应用程序开始支持手指触摸是不是也变得非常简单呢?

当然,这里的消息是经过分类处理的,也许丢掉了某些我们需要的信息。这时,我们可能希望接收并处理原生的触摸消息,以完成更加丰富的功能。这种情况下,你可以注册接收原生触摸消息并通过重写OnTouchInput()函数来对其进行处理:

 virtual BOOL OnTouchInput( CPointpt, intnInputNumber, intnInputsCount, PTOUCHINPUT pInput);

当我们自己开始处理手指触摸消息时,我们可以获得更多的关于触摸情况的信息。例如,我们可以获得当前被触摸的客户区坐标;所有触摸点,也就是第一,第二,第三手指的ID;以及当前所有的触摸点总数等等。通过对这些原生的触摸消息的处理,我们将获得更大的发挥空间,更大的自由。

你可能感兴趣的:(Windows,Touch,Ribbon)