Прядильщик
Spinner — это составной элемент управления, состоящий из кнопки увеличения, кнопки декремента и элемента управления редактирования, все из которых используются для предоставления десятичных значений приложению.
Подробности
На следующем снимке экрана показан спиннер ленты.
Свойства спиннера
Платформа ленты определяет коллекцию ключей свойств для элемента управления Spinner.
Как правило, свойство Spinner обновляется в пользовательском интерфейсе ленты, недействив команду, связанную с элементом управления, путем вызова метода IUIFramework::InvalidateUICommand. Событие недопустимости обрабатывается, а свойство обновляется с помощью метода обратного вызова IUICommandHandler::UpdateProperty обратного вызова.
Метод обратного вызова IUICommandHandler::UpdateProperty не выполняется, а приложение запрашивает обновленное значение свойства, пока свойство не требуется платформе. Например, при активации вкладки и элементе управления, отображаемом в пользовательском интерфейсе ленты, или при отображении подсказки.
Заметка
В некоторых случаях свойство можно получить с помощью метода 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 | Можно обновлять только через недопустимое обновление. |
В следующем разделе кода показано, как обновляются различные свойства элемента управления Spinner в методе IUICommandHandler::UpdateProperty.
//
// 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;
}
Замечания
Если минимальное значение (UI_PKEY_MinValue) спиннера инициализировано до 0,0, приложение должно убедиться, что любое последующее значение, предоставленное элементом управления, не равно -0,0 (отрицательное ноль). Если Spinner предоставляет значение -0.0, приложение должно сбросить это значение до 0,0 (положительного нуля) с помощью метода IUIFramework::SetUICommandProperty, как показано в следующем примере метода IUICommandHandler::Execute для элемента управления Spinner.
Заметка
Если этот тест не выполняется, а значение осталось некорректным, поле редактирования элемента управления отображает строку "Авто".
//
// 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;
}