애플리케이션 모드를 사용하여 리본 메뉴 다시 구성

Windows 리본 프레임워크는 애플리케이션의 상태(컨텍스트라고도 함)를 기반으로 런타임에 리본 UI의 핵심 요소를 동적으로 다시 구성하고 노출할 수 있도록 지원합니다. 태그의 특정 요소와 선언되고 연결된 애플리케이션에서 지원하는 다양한 상태를 애플리케이션 모드라고 합니다.

소개

애플리케이션 모드는 리본 UI에서 일부 핵심 애플리케이션 기능을 노출하는 논리적 컨트롤 그룹으로 구성됩니다. 이러한 모드는 프레임워크 메서드 IUIFramework::SetModes를 호출하여 애플리케이션에서 동적으로 사용하거나 사용하지 않도록 설정되며, 이는 하나 이상의 애플리케이션 모드의 표시 유형을 켜거나 끕니다.

컨텍스트 사용자 인터페이스

리본 프레임워크는 사용자 상호 작용 및 애플리케이션 컨텍스트에 원활하게 응답하는 동적 컨트롤을 통합하여 풍부한 사용자 환경을 제공합니다. 이 풍부한 컨텍스트 UI는 다음 메커니즘의 조합을 통해 제공됩니다.

  • 갤러리 - 항목 컬렉션의 동적 조작을 지원하는 컬렉션 기반 컨트롤입니다.
  • 상황별 탭 - 문서에서 이미지 선택과 같은 작업 영역 컨텍스트의 변경에 따라 표시 여부가 결정되는 리본 탭입니다.
  • 애플리케이션 모드 - 애플리케이션 컨텍스트에 종속된 핵심 애플리케이션 기능입니다.

경우에 따라 애플리케이션 모드는 상황별 탭과 기능적으로 유사하게 표시됩니다. 그러나 근본적인 차이점은 각각의 의도와 scope 있습니다.

컨텍스트 컨트롤은 애플리케이션 내의 컨텍스트 변경에 대한 응답으로 활성화됩니다. 예를 들어 Windows 7용 Microsoft 그림판 사용자가 작업 영역에 텍스트 영역을 삽입할 때 텍스트 관련 명령 그룹이 포함된 상황별 탭이 표시됩니다. 이 컨텍스트 탭은 애플리케이션에 대한 핵심 명령을 포함하지 않으며 애플리케이션 의 컨텍스트가 변경되었기 때문에 UI에만 노출됩니다. 애플리케이션의 핵심 기능(이미지 편집 명령)은 상황별 탭이 표시되더라도 사용자에게 여전히 관련이 있으며 사용할 수 있습니다.

애플리케이션 모드는 애플리케이션이 작동하는 컨텍스트의 변경에 대응하여 기능을 다시 구성한다는 점에서 컨텍스트 컨트롤과 다릅니다. 애플리케이션 모드는 더 높은 수준의 추상화에 있습니다. UI의 핵심 구성 요소가 아닌 기능을 일시적으로 노출하는 대신 애플리케이션의 핵심 기능을 다시 구성하는 방법을 제공합니다. 예를 들어 Windows 7용 Microsoft 그림판 인쇄 미리 보기 명령이 호출될 때 애플리케이션 모드의 스위치가 발생합니다. Microsoft 그림판 인쇄 미리 보기로 전환하면 애플리케이션이 작동하는 컨텍스트가 편집에서 미리 보기로 변경됩니다. 결과적으로 인쇄 미리 보기 가 취소되고 애플리케이션이 편집 컨텍스트에 다시 들어갈 때까지 애플리케이션의 핵심 기능이 변경됩니다.

간단한 애플리케이션 모드 시나리오

다음 시나리오에서는 RibbonApp이라는 애플리케이션에서 애플리케이션 모드를 사용하여 핵심 기능의 개별 측면을 노출하는 방법을 보여 줍니다.

두 애플리케이션 모드는 RibbonApp에 정의되어 있습니다.

  • 단순 모드는 리본 UI 전체에 기본 명령을 표시합니다. 이러한 명령은 활성화된 애플리케이션 모드에 관계없이 항상 표시됩니다.
  • 고급 모드는 애플리케이션의 전문 사용자를 위한 복잡한 명령을 노출합니다. 이러한 고급 명령은 간단한 명령 외에도 리본 UI 전체에 표시됩니다.

기본적으로 RibbonApp은 단순 모드로 열리도록 설정되며 초보 사용자가 요구하는 명령은 애플리케이션 메뉴 탭에 표시됩니다. 다음 스크린샷은 리본앱 애플리케이션 메뉴 탭을 단순 모드로 표시하고 모달 컨트롤을 강조 표시합니다.

간단한 애플리케이션 모드에 대한 탭을 보여 주는 스크린샷간단한 애플리케이션 모드에 대한 애플리케이션 메뉴를 보여 주는 스크린샷

이러한 명령은 초보 사용자에게 충분할 수 있지만 RibbonApp은 고급 모드를 통해 전문 사용자를 지원하며, 애플리케이션 메뉴에서고급 모드로 전환 단추를 클릭하여 활성화하면 추가 핵심 기능을 표시합니다.

이 시나리오는 필요에 따라 켜고 끌 수 있는 개별 애플리케이션 모드에 태그의 다양한 요소를 바인딩하여 쉽게 구현할 수 있습니다. 다음 스크린샷은 고급 모드의 RibbonApp 애플리케이션 메뉴 탭을 보여 줍니다. 모달 컨트롤을 강조 표시합니다.

고급 애플리케이션 모드에 대한 탭을 보여 주는 스크린샷고급 애플리케이션 모드의 애플리케이션 메뉴를 보여 주는 스크린샷

애플리케이션 모드 구현

이 섹션에서는 리본 프레임워크 애플리케이션 모드 구현에 일반적으로 필요한 세 단계를 간략하게 설명합니다. RibbonApp은 각 단계에 대한 예제를 제공하는 데 사용됩니다.

모드 식별

애플리케이션의 각 모드는 애플리케이션이 작동할 수 있는 컨텍스트에 따라 달라지는 논리적 기능 집합을 나타내야 합니다. 예를 들어 애플리케이션이 네트워크 연결이 검색될 때만 관련된 컨트롤을 표시하는 경우 해당 컨트롤은 네트워크 모드 생성을 정당화할 수 있는 네트워킹 컨텍스트 내에서 작동합니다.

RibbonApp에는 언제든지 활성화할 수 있는 두 가지 컨텍스트인 SimpleAdvanced가 있습니다. 따라서 RibbonApp에는 단순 모드와 고급의 두 가지 모드가 필요합니다.

애플리케이션 모드에 컨트롤 할당

애플리케이션 모드가 식별되면 애플리케이션 모드를 지원하는 컨트롤 요소에 대한 태그에서 ApplicationModes 특성을 선언하여 각 리본 컨트롤을 모드에 할당합니다.

리본 뷰를 사용하면 다음 컨트롤 요소에 모드를 지정할 수 있습니다.

리본 프레임워크에서 이러한 컨트롤 요소를 모달 컨트롤이라고 합니다. 바인딩된 모드가 UI에서 활성 상태인 경우에만 표시됩니다.

모달 컨트롤 내에 포함된 컨트롤 요소는 애플리케이션 모드 동작을 상속합니다. 예를 들어 그룹 모달 컨트롤이 고급 모드에 할당되고 고급 모드가 활성화되지 않은 경우 해당 그룹 및 그 안의 모든 컨트롤(모달 또는 기타)은 리본 UI에 표시되지 않습니다.

ApplicationModes 특성을 사용하면 단일 모달 컨트롤을 여러 모드와 연결할 수 있는 1:N(일 대 다) 관계의 모달 컨트롤에 모드가 할당됩니다.

리본 프레임워크는 0에서 31까지의 숫자로 모드를 참조하며, 모드 0은 리본 애플리케이션이 시작될 때 자동으로 활성화되는 기본 모드로 간주됩니다. ApplicationModes 특성을 지정하지 않는 모든 모달 컨트롤은 기본 모드의 멤버로 간주됩니다.

RibbonApp에서 Simple 은 사용자가 시작할 때만 고급 모드 기능이 표시되는 기본 모드입니다.

다음 예제에서는 RibbonApp에 필요한 태그를 보여 줍니다.

<Application.Views>
  <Ribbon>

    <!--Application Menu-->
    <Ribbon.ApplicationMenu>
      <ApplicationMenu CommandName='cmdAppMenu'>                    
        <MenuGroup>
          <Button CommandName='cmdSave'/>                        
          <Button CommandName='cmdExportMetadata' ApplicationModes='1'/>                   
        </MenuGroup>              
        <MenuGroup>
          <Button CommandName='cmdSwitchModes' ApplicationModes ='0,1'/>
          <Button CommandName='cmdExit'/>
        </MenuGroup>
      </ApplicationMenu>
    </Ribbon.ApplicationMenu>
            
    <!--Tabs-->
    <Ribbon.Tabs>
      <!--Home Tab-->
      <Tab CommandName='cmdHomeTab'>
                    
        <!--Scaling Policy for Home tab-->
        <Tab.ScalingPolicy>
          <ScalingPolicy>
            <ScalingPolicy.IdealSizes>
              <Scale Group='cmdSimpleControlsGroup' Size='Medium'/>                                
            </ScalingPolicy.IdealSizes>                     
          </ScalingPolicy>
        </Tab.ScalingPolicy>     
                    
        <!--Simple Controls Group-->
        <Group CommandName='cmdSimpleControlsGroup' SizeDefinition='ThreeButtons-OneBigAndTwoSmall'>                        
          <Button CommandName="cmdPaste" />
          <Button CommandName='cmdCut'/>                        
          <Button CommandName='cmdCopy'/>                        
        </Group>
      </Tab>
                
      <!--Advanced Tab-->
      <Tab CommandName='cmdAdvancedTab' ApplicationModes='1'>
        <!--Advanced Controls Group-->
        <Group CommandName='cmdMetadataGroup' ApplicationModes='1' SizeDefinition='TwoButtons'>
          <Button CommandName='cmdEditMetadata' />
          <Button CommandName='cmdCheckErrors' />
        </Group>
      </Tab>
    </Ribbon.Tabs>                   
                             
  </Ribbon>         
</Application.Views>

이 예제에서는 다음을 보여 줍니다.

  • 기본 모드 0은 명시적으로 선언할 필요가 없습니다. ApplicationModes 특성을 지정하지 않는 모달 컨트롤은 모드 0(RibbonApp 예제의 단순 모드)에 자동으로 바인딩되므로 기본 모달 컨트롤에 대한 특성을 명시적으로 선언할 필요가 없습니다.
  • 컨트롤은 여러 모드에 바인딩할 수 있습니다. RibbonApp의 경우 단순 모드 컨트롤의 ApplicationModes 특성은 cmdSwitchModes단순 모드와 고급 모드의 일부이기 때문에 단추 입니다. 두 모드 중 하나가 활성 상태이면 이 컨트롤이 애플리케이션 메뉴에 표시됩니다.
  • 모달 컨트롤은 부모로부터 상속되지 않습니다. RibbonApp의 고급 탭에는 메타데이터 그룹이 포함됩니다. 이러한 모달 컨트롤은 모두 모드 1(고급 모드)에 할당됩니다. 고급 탭을 모드 1에 할당해도 메타데이터 그룹과 같은 자식 컨트롤이 모드 1에 자동으로 할당되지는 않습니다. 이렇게 하면 런타임에 탭 내의 모든 그룹을 독립적으로 사용하거나 사용하지 않도록 설정할 수 있습니다.
  • 모달이 아닌 컨트롤은 여전히 모드 스위치를 사용할 수 있습니다. RibbonApp의 메타데이터 편집오류 확인 단추는 고급 사용자를 위한 것이며 사용자가 고급 모드로 전환할 때만 사용할 수 있습니다. 애플리케이션 메뉴 내에서 호스트되지 않는 단추 컨트롤은 모달이 아닙니다. 그러나 이러한 단추는 모달 컨트롤(메타데이터 그룹) 내에서 호스트되므로 그룹이 표시되면 표시됩니다. 따라서 고급 모드가 활성화되고 메타데이터 그룹이 리본 UI에 노출되면 이러한 단추가 나타납니다.

런타임 시 모드 전환

태그에 정의된 모드는 상황에 맞는 이벤트에 대한 응답으로 쉽게 사용하거나 사용하지 않도록 설정할 수 있습니다. 앞에서 설명한 대로 리본 애플리케이션은 항상 기본 모드 0에서 시작합니다. 애플리케이션이 초기화되고 모드 0이 활성화되면 IUIFramework::SetModes 함수를 호출하여 활성 모드 집합을 변경할 수 있습니다. 이 함수는 활성 상태여야 하는 모드의 비트 표현으로 32비트 정수 를 사용합니다. 가장 중요한 비트는 모드 0을 나타내고 가장 중요한 비트는 모드 31을 나타냅니다. 비트가 0으로 설정된 경우 모드가 리본 UI에서 활성화되지 않습니다.

RibbonApp에서 사용자가 고급 모드를 사용하도록 설정하면 고급 명령이 간단한 명령과 함께 표시됩니다. 고급 모드로 전환 단추에 대한 명령 처리기는 UIFramework::SetModes를 호출하여 UI에서 활성화된 모드 0(단순) 및 1(고급)을 설정합니다. 다음 예제는 이 함수 호출에 대한 RibbonApp 코드입니다.

const int SIMPLE_MODE = 0;
const int ADVANCED_MODE = 1;
pFramework->SetModes( UI_MAKEAPPMODE(SIMPLE_MODE) | UI_MAKEAPPMODE(ADVANCED_MODE) );

참고

리본 프레임워크 UI_MAKEAPPMODE 매크로는 IUIFramework::SetModes 호출을 준비하기 위해 이러한 비트를 올바르게 설정하는 작업을 간소화합니다.

 

이 예제에서는 다음을 보여 줍니다.

  • UI_MAKEAPPMODE 매크로를 사용하여 모드 집합을 빌드합니다.
  • 모드는 명시적 및 원자적으로 설정됩니다. IUIFramework::SetModes에 전달되는 정수 값은 함수가 반환된 후 활성화되는 모드를 나타냅니다. 단순 모드가 이전에 활성화되었지만 IUIFramework::SetModes고급 모드가 활성화될 때 단순 모드가 활성 상태로 유지됨을 나타내야 합니다.
  • 기본 모드를 제거할 수 있습니다. RibbonApp에서 기본 모드(모드 0)는 제거되지 않지만 UI의 고급 명령만 노출하는 호출 g_pFramework->SetModes(UI_MAKEAPPMODE(ADVANCED_MODE))을 사용하여 제거할 수 있습니다.

참고

애플리케이션의 모드가 다시 구성되면 리본은 UI에서 이전에 선택한 탭을 유지하려고 시도합니다. 새 모드 집합에 호출 전에 선택한 탭이 더 이상 없으면 리본은 애플리케이션 메뉴에 가장 가까운 레이아웃에서 탭을 선택합니다. 이 탭은 사용자와 가장 관련된 명령을 포함하기 위한 것입니다. 자세한 내용은 리본 사용자 환경 지침을 참조하세요.

 

설명

리본 메뉴에는 항상 하나 이상의 활성 모드가 있어야 합니다. 애플리케이션이 모드 값이 0인 IUIFramework::SetModes 를 호출하여 모든 모드를 비활성화하려고 하면 E_FAIL 반환되고 활성 모드 집합은 변경되지 않은 상태로 유지됩니다.

프레임워크를 사용하려면 리본 UI에 항상 하나 이상의 탭이 있어야 합니다. 따라서 기본 모드(모드 0)와 각 모드 전환 후에 하나 이상의 탭이 노출되어야 합니다.

리본 UI의 일부 영역이 애플리케이션 모드의 영향을 받는 것은 아닙니다. 예를 들어 모드를 사용하지 않도록 설정하면 이전에 빠른 실행 도구 모음에 추가된 리본 메뉴의 단추가 사라지면 해당 단추가 빠른 실행 도구 모음에 유지되므로 사용자가 단추에 바인딩된 명령을 실행할 수 있습니다. 일반적으로 명령이 하나 이상의 비활성 모드에 속하는 경우 UI_PKEY_Enabled 속성을 0( VARIANT_FALSE )으로 설정하여 해당 명령을 사용하지 않도록 설정해야 합니다.

리본 메뉴 사용자 환경 지침

상황에 맞는 탭 표시