Controle giratório
O Spinner é um controle composto que consiste em um botão de incremento, um botão decremento e um controle de edição, todos usados para fornecer valores decimais ao aplicativo.
Detalhes
A captura de tela a seguir ilustra o Rotador da Faixa de Opções.
Propriedades do Spinner
A estrutura da Faixa de Opções define uma coleção de chaves de propriedade para o controle Spinner.
Normalmente, uma propriedade Spinner é atualizada na interface do usuário da faixa de opções invalidando o Comando associado ao controle por meio de uma chamada para o método IUIFramework::InvalidateUICommand . O evento de invalidação é tratado e as atualizações de propriedade definidas pelo método de retorno de chamada IUICommandHandler::UpdateProperty .
O método de retorno de chamada IUICommandHandler::UpdateProperty não é executado e o aplicativo consultou um valor de propriedade atualizado até que a propriedade seja exigida pela estrutura. Por exemplo, quando uma guia é ativada e um controle revelado na interface do usuário da faixa de opções ou quando uma dica de ferramenta é exibida.
Observação
Em alguns casos, uma propriedade pode ser recuperada por meio do método IUIFramework::GetUICommandProperty e definida com o método IUIFramework::SetUICommandProperty .
A tabela a seguir lista as chaves de propriedade associadas ao controle Spinner.
Chave de Propriedade | Observações |
---|---|
UI_PKEY_DecimalPlaces | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_DecimalValue | Dá suporte a IUIFramework::GetUICommandProperty e IUIFramework::SetUICommandProperty.
Nota: Se o Comando associado ao controle for invalidado por meio de uma chamada para IUIFramework::InvalidateUICommand, a estrutura consultará essa propriedade quando UI_INVALIDATIONS_VALUE for passada como o valor dos sinalizadores. |
UI_PKEY_Enabled | Dá suporte a IUIFramework::GetUICommandProperty e IUIFramework::SetUICommandProperty. |
UI_PKEY_FormatString | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_Increment | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_Keytip | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_Label | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_LargeHighContrastImage | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_LargeImage | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_MaxValue | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_MinValue | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_RepresentativeString | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_SmallHighContrastImage | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_SmallImage | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_TooltipDescription | Só pode ser atualizado por meio de invalidação. |
UI_PKEY_TooltipTitle | Só pode ser atualizado por meio de invalidação. |
A seção de código a seguir demonstra como várias propriedades do controle Spinner são atualizadas no método 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;
}
Comentários
Se o valor mínimo (UI_PKEY_MinValue) de um Spinner for inicializado como 0,0, o aplicativo deverá garantir que qualquer valor subsequente fornecido pelo controle não seja igual a -0,0 (zero negativo). Se o Spinner fornecer um valor de -0.0, o aplicativo deverá redefinir esse valor para 0,0 (zero positivo) usando o método IUIFramework::SetUICommandProperty , conforme mostrado no exemplo a seguir de um método IUICommandHandler::Execute para um controle Spinner.
Observação
Se esse teste não for executado e o valor deixado não corrigido, o campo de edição do controle exibirá a cadeia de caracteres "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;
}