技术开发 频道

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

  注册感兴趣的控件

  按照Ribbon界面控件消息的处理流程,我们首先需要在OnCreateCommand函数中为我们感兴趣的控件进行注册,这样当控件有动作发生的时候,CApplication类才会收到相应的控件消息,进而可以对其进行处理。在CApplication类的OnCreateCommand函数中,我们完成相应控件的注册:

STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, __in UI_COMMANDTYPE typeID, __deref_out IUICommandHandler** ppCommandHandler)
    {
        
// 对相应控件的消息进行注册
        
if (nCmdID == cmdMyButton
            || nCmdID
== cmdDeleteTable
            || nCmdID
== cmdAddTable
            || nCmdID
== cmdPrintRelationships)
        {
            return QueryInterface(IID_PPV_ARGS(ppCommandHandler));
        }
        return E_NOTIMPL;
    }

  在这段代码中,我们根据控件的Symbol选取了几个需要进行消息处理的控件,当这几个控件有动作发生时,比如比鼠标点击,或者是进行了选择,IUIFramework会发送相应的消息给宿主对象CApplication,从而让我们可以有机会对这些消息进行处理。

  处理控件消息

  对于普通的控件点击消息或者是选择消息等动作消息,我们需要重写CApplication类的消息处理函数Execute函数,在其中对消息进行处理:

// 消息处理函数
STDMETHODIMP
Execute(UINT nCmdID,
        UI_EXECUTIONVERB verb,
        __in_opt
const PROPERTYKEY* key,
        __in_opt
const PROPVARIANT* ppropvarValue,
        __in_opt IUISimplePropertySet
* pCommandExecutionProperties)
    {
        HRESULT hr
= S_OK;

        switch (verb)
        {
                        
// 只处理感兴趣的消息类型
        
case UI_EXECUTIONVERB_EXECUTE:
                                    
// 判断消息来源
            
if (nCmdID == cmdMyButton)
            {
                                              
// 执行具体的业务逻辑
                                              
// 这里我们获得系统时间并进行输出
                SYSTEMTIME sys;
                GetLocalTime(
&sys );
                wchar_t strInfo[
256] = L"";
                wsprintf( strInfo, L
"当前系统时间:
%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",
                    sys.wYear,sys.wMonth,sys.wDay,
                    sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,
                    sys.wDayOfWeek);
                
// 显示消息框
                                                 MessageBox(
NULL, strInfo,
                    L
"当前系统时间”,
                    MB_OK);
            }
            break;
        }    
        return hr;
    }

  现在编译运行这个解决方案,当我们点击cmdMyButton 所对应的“MyButton”这个按钮时,就可以得到一个消息框报告当前的系统时间。当然,我们这里只是对按钮控件的动作进行处理,对于其他类型控件的消息处理,都是按照相同的流程进行。


图2  按钮控件的点击事件

0
相关文章