注册感兴趣的控件
按照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;
}
{
// 对相应控件的消息进行注册
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;
}
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 按钮控件的点击事件