技术开发 频道

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

  在运行时对控件属性进行修改

  在某些情况下,我们需要在运行时对控件的属性进行修改。例如,在应用程序运行的某种状态下,我们可能需要禁用某些控件,或者是修改控件的标签文本,图标等等。对控件属性的修改,可以通过直接修改控件属性达到,也可以通过调用InvalidateUICommand函数刷新控件的属性,然后在UpdateProperty函数中进行控件属性更改消息处理,实现具体的属性修改。下面我们分别来看看这两种方式是如何进行的。

  在这个例子中,我们处理两个按钮控件的点击消息,让他们分别禁用另外的按钮控件和修改按钮的标签文本。在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)
            {
                
//
                PROPVARIANT varNew;

                BOOL _fEnabled
= FALSE;
                                                
// 初始化属性值
                hr
= UIInitPropertyFromBoolean(UI_PKEY_Enabled,
                                                         _fEnabled,
&varNew);
                
if (FAILED(hr))
                {
                    return hr;
                }
                                                
// 为控件cmdDeleteTable设置新的属性值
                hr
= g_pFramework->SetUICommandProperty(cmdDeleteTable,
                                                        UI_PKEY_Enabled, varNew);
                
if (FAILED(hr))
                {
                    return hr;
                }
            }
            
else if (nCmdID == cmdAddTable)
            {
                
// 发送属性更新消息对控件属性UI_PKEY_Label进行更新
                hr
= g_pFramework->InvalidateUICommand(
                                                             cmdPrintRelationships,
                                                             UI_INVALIDATIONS_PROPERTY,
&UI_PKEY_Label);
                
if (FAILED(hr))
                {
                              return hr;
                }
            }
            break;
        }    
        return hr;
    }

  在cmdMyButton按钮的消息处理中,我们使用SetUICommandProperty就可以直接修改控件的属性了。在这里,我们通过设置cmdDeleteTable按钮控件的UI_PKEY_Enabled属性为FALSE,达到了禁用这个控件的目的。而在cmdAddTable按钮的消息处理中,我们只是调用了IUIFramework的InvalidateUICommand函数,这表示它会自动调用CApplication类的UpdateProperty来实现控件属性的更新,所以对于第二种方式,我们还需要实现这个函数,在其中完成属性的更新:

STDMETHODIMP UpdateProperty(UINT nCmdID,
        __in REFPROPERTYKEY key,
        __in_opt
const PROPVARIANT* ppropvarCurrentValue,
        __out PROPVARIANT
* ppropvarNewValue)
    {
        UNREFERENCED_PARAMETER(ppropvarCurrentValue);

        HRESULT hr
= E_FAIL;

        
if (key == UI_PKEY_Label)
        {
            
// 更新控件cmdPrintRelationships的标签文本
            
if (nCmdID == cmdPrintRelationships)
            {
                hr
= UIInitPropertyFromString(UI_PKEY_Label,
                        L
"New Label", ppropvarNewValue);
            }
        }
        return hr;
    }


 

0
相关文章