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.

captura de tela de um controle giratório na faixa de opções do windows live moviemaker.

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(&param);

        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;
}

Biblioteca de Controle da Estrutura da Faixa de Opções do Windows

Elemento de marcação spinner