Spinner
Spinner 是一个复合控件,由递增按钮、递减按钮和编辑控件组成,所有这些控件都用于向应用程序提供十进制值。
详细信息
以下屏幕截图演示了功能区微调器。
微调器属性
功能区框架定义 Spinner 控件 的属性键 集合。
通常,通过调用 IUIFramework::InvalidateUICommand 方法使与控件关联的命令失效,从而在功能区 UI 中更新 Spinner 属性。 无效事件由 IUICommandHandler::UpdateProperty 回调方法处理,并更新定义的属性。
IUICommandHandler::UpdateProperty 回调方法不会执行,应用程序会查询更新的属性值,直到框架需要该属性。 例如,在功能区 UI 中激活选项卡和显示控件时,或显示工具提示时。
注意
在某些情况下,可以通过 IUIFramework::GetUICommandProperty 方法检索属性,并使用 IUIFramework::SetUICommandProperty 方法进行设置。
下表列出了与 Spinner 控件关联的属性键。
属性键 | 注释 |
---|---|
UI_PKEY_DecimalPlaces | 只能通过失效进行更新。 |
UI_PKEY_DecimalValue | 支持 IUIFramework::GetUICommandProperty 和 IUIFramework::SetUICommandProperty。
注意:如果通过调用 IUIFramework::InvalidateUICommand 使与控件关联的命令失效,框架将在 作为标志的值传递时UI_INVALIDATIONS_VALUE 查询此属性。 |
UI_PKEY_Enabled | 支持 IUIFramework::GetUICommandProperty 和 IUIFramework::SetUICommandProperty。 |
UI_PKEY_FormatString | 只能通过失效进行更新。 |
UI_PKEY_Increment | 只能通过失效进行更新。 |
UI_PKEY_Keytip | 只能通过失效进行更新。 |
UI_PKEY_Label | 只能通过失效进行更新。 |
UI_PKEY_LargeHighContrastImage | 只能通过失效进行更新。 |
UI_PKEY_LargeImage | 只能通过失效进行更新。 |
UI_PKEY_MaxValue | 只能通过失效进行更新。 |
UI_PKEY_MinValue | 只能通过失效进行更新。 |
UI_PKEY_RepresentativeString | 只能通过失效进行更新。 |
UI_PKEY_SmallHighContrastImage | 只能通过失效进行更新。 |
UI_PKEY_SmallImage | 只能通过失效进行更新。 |
UI_PKEY_TooltipDescription | 只能通过失效进行更新。 |
UI_PKEY_TooltipTitle | 只能通过失效进行更新。 |
以下代码部分演示了如何在 IUICommandHandler::UpdateProperty 方法中更新 Spinner 控件的各种属性。
//
// FUNCTION: UpdateProperty()
//
// PURPOSE: Called by the Ribbon framework when a command property needs
// to be updated.
//
// COMMENTS: This function is used to provide new command property values for
// the spinner when requested by the Ribbon framework.
//
STDMETHODIMP CCommandHandler::UpdateProperty(
UINT nCmdID,
REFPROPERTYKEY key,
const PROPVARIANT* ppropvarCurrentValue,
PROPVARIANT* ppropvarNewValue)
{
UNREFERENCED_PARAMETER(ppropvarCurrentValue);
HRESULT hr = E_NOTIMPL;
if (nCmdID == IDR_CMD_SPINNER_RESIZE)
{
// Set the minimum value
if (IsEqualPropertyKey(key, UI_PKEY_MinValue))
{
ZeroMemory(ppropvarNewValue, sizeof(*ppropvarNewValue));
ppropvarNewValue->vt = VT_DECIMAL;
VarDecFromR8(-10.0, &ppropvarNewValue->decVal);
hr = S_OK;
}
// Set the maximum value
else if (IsEqualPropertyKey(key, UI_PKEY_MaxValue))
{
ZeroMemory(ppropvarNewValue, sizeof(*ppropvarNewValue));
ppropvarNewValue->vt = VT_DECIMAL;
VarDecFromR8(10.0, &ppropvarNewValue->decVal);
hr = S_OK;
}
// Set the increment
else if (IsEqualPropertyKey(key, UI_PKEY_Increment))
{
ZeroMemory(ppropvarNewValue, sizeof(*ppropvarNewValue));
ppropvarNewValue->vt = VT_DECIMAL;
VarDecFromR8(2.0, &ppropvarNewValue->decVal);
hr = S_OK;
}
// Set the number of decimal places
else if (IsEqualPropertyKey(key, UI_PKEY_DecimalPlaces))
{
hr = InitPropVariantFromUInt32(1, ppropvarNewValue);
hr = S_OK;
}
// Set the format string
else if (IsEqualPropertyKey(key, UI_PKEY_FormatString))
{
hr = InitPropVariantFromString(L"px", ppropvarNewValue);
hr = S_OK;
}
// Set the representative string
else if (IsEqualPropertyKey(key, UI_PKEY_RepresentativeString))
{
hr = InitPropVariantFromString(L"AAAAAAA", ppropvarNewValue);
hr = S_OK;
}
}
return hr;
}
注解
如果将 spinner UI_PKEY_MinValue) 的 最小值 (初始化为 0.0,则应用程序应确保控件提供的任何后续值不等于 -0.0 (负零) 。 如果 Spinner 提供值 -0.0,则应用程序应使用 IUIFramework::SetUICommandProperty 方法将此值重置为 0.0 (正零) ,如以下示例所示的 IUICommandHandler::Execute 方法的 Spinner 控件。
注意
如果未执行此测试并且值未更正,则控件的编辑字段将显示字符串“Auto”。
//
// FUNCTION: Execute()
//
// PURPOSE: Called by the Ribbon framework when a command is executed by the user.
// For this sample, when an increment or decrement button is pressed or
// a new value is entered in the Spinner edit field.
//
STDMETHODIMP CCommandHandler::Execute(
UINT nCmdID,
UI_EXECUTIONVERB verb,
const PROPERTYKEY* key,
const PROPVARIANT* ppropvarValue,
IUISimplePropertySet* pCommandExecutionProperties)
{
UNREFERENCED_PARAMETER(pCommandExecutionProperties);
HRESULT hr = E_NOTIMPL;
if (verb == UI_EXECUTIONVERB_EXECUTE)
{
RenderParam param;
g_renderer.GetRenderParam(¶m);
if (nCmdID == IDR_CMD_SPINNER_RESIZE)
{
// Spinner value is negative.
if (!(ppropvarValue->decVal.sign == 0))
{
// Check if the value supplied by the Spinner is -0
// and correct the value if necessary.
// If this value is left uncorrected, the edit field
// of the control will display the string "Auto" when
// UI_PKEY_MinValue is set to 0.
if (ppropvarValue->decVal.Lo64 == 0)
{
// Initialize a new PROPVARIANT structure.
PROPVARIANT m_varNewVal;
PropVariantInit(&m_varNewVal);
// The replacement DECIMAL value.
DECIMAL m_dVal;
hr = VarDecFromI4(0, &m_dVal);
if (FAILED(hr))
{
return hr;
}
// Initialize the new DECIMAL value.
UIInitPropertyFromDecimal(UI_PKEY_DecimalValue, m_dVal, &m_varNewVal);
// Set the UI_PKEY_DecimalValue to the new DECIMAL value.
hr = g_pFramework->SetUICommandProperty(nCmdID, UI_PKEY_DecimalValue, m_varNewVal);
if (FAILED(hr))
{
return hr;
}
}
// Decrease size of shape in document space.
param.iShapeSizeIncrement = -ppropvarValue->intVal;
}
// Spinner value is positive.
else
{
// Increase size of shape in document space.
param.iShapeSizeIncrement = ppropvarValue->intVal;
}
}
g_renderer.UpdateRenderParam(param);
}
return hr;
}