在运行时对控件属性进行修改
在某些情况下,我们需要在运行时对控件的属性进行修改。例如,在应用程序运行的某种状态下,我们可能需要禁用某些控件,或者是修改控件的标签文本,图标等等。对控件属性的修改,可以通过直接修改控件属性达到,也可以通过调用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;
}
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;
}
__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;
}