• 2009-08-25

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

    上篇我们说到如何利用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控件消息


    收藏到:Del.icio.us