• 上篇我们说到如何利用XML文件定义和描述Ribbon界面,从分工的意义上讲,其实那是UI设计师的活儿。作为程序员,更加专注的是如何对 Ribbon控件的消息进行响应,完成相应的业务逻辑。现在,该轮到程序员上场了!在Ribbon界面编辑完成的基础上,我们来看看如何利用 Windows Scenic Ribbon API处理各种控件消息,让Ribbon界面真正地投入使用。

      在前面一篇文章中,我们讨论了如何利用XML文件创建Ribbon控件,对控件进行排布和设置控件的缩放策略等等,可以说,这些工作都是UI设计师的任务。对程序员来说,更重要的是对控件的消息进行处理实现其业务逻辑。

      添加消息处理功能

       大家应该还记得,在本系列前面的文章中,我们创建了一个派生自IUIApplication的Ribbon界面宿主对象类CApplication,并 利用这个类完成了Ribbon界面的创建,初始化以及与Windows应用程序的集成。要对Ribbon控件的消息进行处理,我们还是要借助这个宿主对象 类。为了使得CApplication类具有控件消息处理的能力,我们需要修改它的定义,让它同时也从IUICommandHandler派生。而 IUICommandHandler类,则是Scenic Ribbon API提供给我们的控件消息处理类,只要CApplication从这个类派生,就具有了相应的控件消息的处理能力。

      为了对控件消息进行处理,我们修改CApplication类的定义如下:

    // 引入Scenic Ribbon API的头文件
    #include
    <uiribbon.h>
    // 引入编译生成的资源头文件
    #include
    "ribbonres.h"
    // 调用Windows API获得系统时间
    #include
    "windows.h"
    #include
    "stdio.h"

    IUIFramework
    * g_pFramework = NULL;
    // Ribbon界面宿主程序
    class CApplication
        :
    public CComObjectRootEx<CComMultiThreadModel>
            ,
    public IUIApplication  // 处理Ribbon界面的创建和初始化
            ,
    public IUICommandHandler // 处理Ribbon控件的消息

      然后,我们需要利用COM_INTERFACE_ENTRY宏定义COM_MAP,在CApplication类的定义中,添加:

    public:
        BEGIN_COM_MAP(CApplication)
              COM_INTERFACE_ENTRY(IUIApplication)
                      COM_INTERFACE_ENTRY(IUICommandHandler)
        END_COM_MAP()

       这样,Ribbon控件的消息就会发送到CApplication类,由CApplication类进行处理。在整个Scenic Ribbon API中,Ribbon控件消息的处理流程如下图所示。除了之前我们介绍的跟Ribbon界面创建和初始化相关的过程之外,为了完成控件消息,我们首先需 要为感兴趣的控件进行注册,这些工作都会在OnCreateCommand函数中完成。完成控件的注册后,当我们需要进行消息处理的控件有消息发生 时,IUIFramework就会将这些消息发送给CApplication,而我们就可以在CApplication类中对具体的消息进行处理。 Ribbon控件的消息主要分成两种:一种是来自控件的动作消息,比如按钮控件被点击,ComboBox的选择发生了变化等。这类消息都在Execute 函数中进行处理;另外一种是则对控件属性进行更新的消息,这类消息在UpdateProperty函数中进行处理。


    图1  Ribbon界面的消息处理流程

     

    VS2010与Win7共舞:响应Ribbon控件消息

  • 在上一篇文章中,我们介绍了如何利用Windows Scenic Ribbon API为一个普通的Windows应用程序添加Ribbon界面。其中,我们只是简单地添加了一个Ribbon面板和一个按钮控件,还没有实现任何的具体 功能。这就像我们创建了一个Ribbon容器,等着我们将各种Ribbon控件装进去并对控件的各种消息进行处理,以实现相应的业务逻辑。

      在这一篇文章中,我们就来介绍如何向Ribbon面板添加各种Ribbon控件并实现控件的合理排布。

       微软在自己大量用户体验研究的基础上,同时积极汲取用户对第一代Ribbon界面的反馈,在第二代Scenic Ribbon界面中,提供了更加丰富的Ribbon控件,使得Ribbon界面的控件更加丰富。通过这些Ribbon控件的灵活组合应用,能够应对各种应 用程序对Ribbon界面控件的需要。下面我们就来介绍一下如何为Ribbon界面添加各种Ribbon控件并对这些控件进行排列布局。

      

      添加Ribbon界面添加应用程序菜单

       除了Ribbon面板,Ribbon界面的最大革新之处就是它的应用程序菜单。在Ribbon界面中,我们可以在Ribbon面板上布置一些常用的命令 功能,而对于一些不太常用的功能,比如文件打开关闭,系统设置等等,都可以在应用程序菜单中进行。Ribbon界面中应用程序菜单的定义非常简单,跟添加 按钮控件相似,我们需要先在XML文件的命令部分添加菜单中需要的各个菜单项:

    <!—应用程序菜单项-->
        
    <Command Name="FileMenu"
                 Symbol
    ="cmdFileMenu"
                 Id
    ="25000" />
        
    <!—为最长使用文档列表定义控件 -->
        
    <Command Name="cmdMRUList"
                 Symbol
    ="cmdMRUList"
                 Id
    ="25050"/>
        
    <Command Name="cmdMRUItems"
                 Symbol
    ="cmdMRUItems"
                 Id
    ="25051"/>
        
    <Command Name="cmdNew"
                 Symbol
    ="cmdNew"
                 Comment
    ="New"
                 Id
    ="25001"
                 LabelTitle
    ="New">
            
    <Command.LargeImages>
              
    <Image Source="NewL.bmp"/>
            
    </Command.LargeImages>
        
    </Command>
        
    <Command Name="cmdOpen"
                 Symbol
    ="cmdOpen"
                 Comment
    ="Open"
                 Id
    ="25002"
                 LabelTitle
    ="Open"/>
        
    <Command Name="cmdSave"
                 Symbol
    ="cmdSave"
                 Comment
    ="Save"
                 Id
    ="25003"
                 LabelTitle
    ="Save"
                 TooltipTitle
    ="Save tooltip title"
                 TooltipDescription
    ="Save tooltip description."/>
        
    <Command Name="cmdPrint"
                 Symbol
    ="cmdPrint"
                 Comment
    ="Print"
                 Id
    ="25004"
                 LabelTitle
    ="Print" />
        
    <Command Name="cmdExit"
                 Symbol
    ="cmdExit"
                 Comment
    ="Exit"
                 Id
    ="25005"
                 LabelTitle
    ="Exit" />


  • 【IT168专稿】在之前关于Visual Studio 2010的新特性介绍文章中,我们已经喊出了“全体程序员注意:Ribbon全面来袭!”的口号。在这里,我们不再去强调Ribbon界面的易用和高效, 也不去强调和证明它将成为未来应用程序界面的一种趋势。为了让我们的应用程序“Ready for Windows 7”,我们有必要根据实际的情况需要,为我们的应用程序添加Ribbon界面。

      在前面的文章中,我们介绍了如何为MFC应用程序添加 Ribbon界面,但是这种方法只适用于基于MFC的Windows应用程序。如果我们的应用程序是标准的Windows应用程序该怎么办呢?为了推广 Ribbon界面,为了讨好程序员们,让程序员可以轻松地为各种应用程序创建Ribbon界面,微软真是不遗余力,不断地推出新的Ribbon界面接口。 为了可以让所有基于C++的普通Windows应用程序都可以添加Ribbon界面,微软在Windows 7 SDK中,又推出了基于COM的接口——Scenic Ribbon API。

      利用Scenic Ribbon API,我们可以更加灵活方便地为各种Windows应用程序添加Ribbon界面,改善应用程序的用户体验。在接下来的文章中,我们就介绍一下如何利用这种新的方式为普通Windows应用程序添加Ribbon界面。

       我们都知道,Ribbon界面是随着Office 2007一同发布的。在过去的几年中,微软不断地吸取用户对Ribbon界面的反馈,不断地对其进行改进,到了Windows 7,微软正式加入了命名为Scenic Ribbon的第二代Ribbon界面,即取代第一代Ribbon的升级版本。随着Scenic Ribbon成为Windows 7的一部分以及微软所提供的Scenic Ribbon API,这意味着今后第三方程序开发者能在自己开发的应用程序中免费用上这种界面形式。Scenic Ribbon作为第二代Ribbon界面,所适用的是所有的Windows应用程序,和前代有所不同是理所当然的。例如,由于最初Ribbon界面是 Office专用,因此使用Ribbon界面的Office 2007程序窗口左上角都有一个比较显眼的Office图标按钮。当应用到其他程序之后,这个图标显然不能继续存在,因此在Scenic Ribbon中,这个位置就被相应应用程序自身的图标所取代。另外,为了满足各种应用程序的需要,Scenic Ribbon还添加了部分Ribbon控件,使得Ribbon界面的控件更加丰富,能够应对各种应用程序对Ribbon界面控件的需要。值得一提的 是,Office作为Ribbon界面的开山鼻祖,到了Office的下一个版本Office 2010,也全面使用了Scenic Ribbon以替代第一代Ribbon界面。

      
     图1 Office 2010全面使用Scenic Ribbon界面

     

    阅读全文:

    VS 2010与Windows7共舞:又见Ribbon

  • 书接上回,在前面两篇文章中,我们结合Office Word和 Office Outlook,分别介绍了如何在Visual Sutton  2010中进行文档级自定义项和应用程序级插件的开发。大家应该都注意到,这两种Office扩展应用几乎都是在宿主程序的某个动作后自动执行,无法跟用 户进行交互。

      在第一个文档级自定义项的例子中,如果我们想在文档打开过后,按照需要在合适的位置插入一个请假条,该怎么办呢?同样的在第二个Outlook整理附件的 例子中,如果我们想在收取所有邮件后,手动地进行邮件的分拣处理该如何进行呢?这时,我们就需要用到Office开发的第三种情况:Office Ribbon界面插件。

      第一篇:详解VSTS与OFFICE的协同开发:WORD篇

      第二篇:详解VSTS与OFFICE的协同开发:Outlook篇

      通过前面文章的介绍,我们知道在Visual Studio 2010中,Office开发主要有以下三种类型:文档级自定义项,应用程序级插件和Ribbon界面插件。前两种插件应用都是自动加载运行,无法跟用户 进行交互,所以其应用场合有限。在这篇文章中,我们将介绍能够跟用户进行交互,从而能够完成更加复杂的Office任务的Ribbon界面插件。

      Ribbon界面插件是在文档级自定义项或者是应用程序级插件的基础上添加Ribbon界面控件而完成的。跟应用程序级插件相类似,Office Ribbon界面插件随着宿主程序的启动而被加载,同时在Office宿主程序的Ribbon界面中添加相应的控件,从而利用这些控件与用户进行交互,实 现相应的功能。在Ribbon界面插件中,你可以自定义Office程序的Ribbon UI,可以在功能区以控件形式的组织相关的命令,完成相应的功能。界面插件通过在Office程序的“Add-ons”Ribbon页面中添加相应的控 件,使它们易于查找,从而与用户进行界面交互,实现相应的功能。


    图1 Ribbon界面插件添加的Ribbon界面

      在本文中,我们以Excel为例,介绍如何利用Ribbon界面插件,获取用户的在界面上的输入输入,然后根据用户的输入对Excel的数据进行计算和处理。在进行具体的开发之前,我们还是先来了解一下Excel对象模型。

     

    详解VSTS与OFFICE的协同开发:Excel篇

  • 在上回中,我们简单地介绍了开发Ribbon界面的一般流程,同时演示了如何创建包含命令按钮(CMFCRibbonButton)的简单Ribbon界面,相信很多朋友都跃跃欲试,想为自己的软件创 建专业的Ribbon界面。但是,仅仅使用命令按钮是远远不能满足软件界面的交互需求的,同时也没有完全发挥Ribbon界面的强大威力。为了支持 Ribbon界面,Visual Studio 2010为我们提供了很多控件,除了我们上回介绍的命令按钮(CMFCRibbonButton)之外,还有工具廊 (CMFCRibbonGallery),颜色按钮(CMFCRibbonColorButton),编辑框(CMFCRibbonEdit),进度条 (CMFCRibbonProgressBar)等等。合理地使用这些控件,我们可以创建丰富的Ribbon界面,增强软件的可用性。在这回中,我们就介 绍一下如何使用这些控件,创建更加复杂的Ribbon界面,完成更加复杂的交互任务。  为了更好地理解和创建Ribbon界面,在开始具体地介绍各种控件之前,我们先来了解一下Ribbon界面的结构层次。在上一回中,我们介绍了Ribbon界面主要由Ribbon面板(CMFCRibbonBar)构成,而Ribbon面板主要的主要分为三个层次:

    Visual C++ 2010创建Ribbon界面(下)