Spinner

회전자는 증가 단추, 감소 단추 및 편집 컨트롤로 구성된 복합 컨트롤로, 모두 애플리케이션에 10진수 값을 제공하는 데 사용됩니다.

세부 정보

다음 스크린샷에서는 리본 스피너를 보여 줍니다.

screen shot of a spinner control in the windows live moviemaker ribbon.

회전자 속성

Ribbon 프레임워크는 회전자 컨트롤에 대한 속성 키 컬렉션을 정의합니다.

일반적으로 회전자 속성은 IUIFramework::InvalidateUICommand 메서드 호출을 통해 컨트롤과 연결된 명령을 무효화하여 리본 UI에서 업데이트됩니다. IUICommandHandler::UpdateProperty 콜백 메서드에 의해 무효화 이벤트가 처리되고 속성 업데이트가 정의됩니다.

IUICommandHandler::UpdateProperty 콜백 메서드가 실행되지 않고 프레임워크에서 속성이 필요할 때까지 애플리케이션이 업데이트된 속성 값을 쿼리합니다. 예를 들어 탭이 활성화되고 리본 UI에 컨트롤이 표시되는 경우 또는 도구 설명이 표시되는 경우입니다.

참고

경우에 따라 IUIFramework::GetUICommandProperty 메서드를 통해 속성을 검색하고 IUIFramework::SetUICommandProperty 메서드를 사용하여 설정할 수 있습니다.

다음 표에서는 회전자 컨트롤과 연결된 속성 키를 나열합니다.

속성 키 메모
UI_PKEY_DecimalPlaces 무효화를 통해서만 업데이트할 수 있습니다.
UI_PKEY_DecimalValue IUIFramework::GetUICommandPropertyIUIFramework::SetUICommandProperty를 지원합니다.
[! 참고]
IUIFramework::InvalidateUICommand 호출을 통해 컨트롤과 연결된 명령이 무효화되면 프레임워크는 플래그 값으로 전달될 때 UI_INVALIDATIONS_VALUE 이 속성을 쿼리합니다.

UI_PKEY_Enabled IUIFramework::GetUICommandPropertyIUIFramework::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 메서드에서 회전자 컨트롤의 다양한 속성이 업데이트되는 방법을 보여 줍니다.

//
//  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(음수 0)이 아닌지 확인해야 합니다. 회전자가 -0.0 값을 제공하는 경우 애플리케이션은 다음 IUICommandHandler::Execute 메서드의 다음 예제와 같이 IUIFramework::SetUICommandProperty 메서드를 사용하여 이 값을 0.0(양의 0)으로 다시 설정해야 합니다.

참고

이 테스트가 수행되지 않고 값이 수정되지 않은 상태로 두면 컨트롤의 편집 필드에 "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;
}

Windows 리본 프레임워크 컨트롤 라이브러리

회전자 태그 요소