다음을 통해 공유


리본 애플리케이션 만들기

Windows 리본 프레임워크는 두 가지 고유하지만 종속적인 개발 플랫폼으로 구성됩니다. 즉, 컨트롤과 시각적 레이아웃을 선언하는 XAML(Extensible Application Markup Language)을 기반으로 하는 태그 언어와 명령 기능 및 애플리케이션 후크를 정의하는 C++ COM(구성 요소 개체 모델) 기반 인터페이스 집합이 있습니다. 리본 프레임워크 아키텍처 내에서 이러한 작업 분할을 수행하려면 프레임워크에서 제공하는 풍부한 UI 기능을 활용하려는 개발자가 태그에서 UI를 디자인하고 설명한 다음 리본 프레임워크 COM 인터페이스를 사용하여 프레임워크를 호스트 애플리케이션에 연결해야 합니다.

리본 로드맵

표시되는 컨트롤 및 배치 위치와 같은 리본 애플리케이션의 시각적 측면은 태그에 선언됩니다( 리본 태그를 사용하여 명령 및 컨트롤 선언 참조). 단추를 누를 때 발생하는 작업과 같은 애플리케이션 명령 논리는 코드에서 구현됩니다.

리본을 구현하고 Windows 애플리케이션에 통합하는 프로세스에는 태그 작성, 태그 컴파일, 코드 작성, 전체 애플리케이션 컴파일 및 연결의 네 가지 기본 작업이 필요합니다.

다음 다이어그램에서는 일반적인 리본 구현에 대한 워크플로를 보여 줍니다.

일반적인 리본 구현에 대한 워크플로를 보여 주는 다이어그램

다음 섹션에서는 이 프로세스를 자세히 설명합니다.

태그 작성

리본 UI를 디자인한 후 애플리케이션 개발자의 첫 번째 작업은 리본 태그가 있는 UI를 설명하는 것입니다.

중요

리본 프레임워크 태그 스키마 파일인 UICC.xsd는 Windows 7 및 .NET Framework 4.0용 Microsoft Windows SDK(소프트웨어 개발 키트)와 함께 설치됩니다. 표준 설치 경로를 사용하여 파일은 %ProgramFiles%\Microsoft SDKs\Windows\[버전 번호]\Bin 폴더에 있습니다. 이 폴더는 많은 XML 편집기에서 참조하여 힌트 및 자동 완성을 제공할 수 있습니다.

 

리본 컨트롤, 리본 명령(리본 컨트롤의 기본 기능을 제공하는 컨트롤 독립적 요소) 및 모든 컨트롤 레이아웃 및 시각적 관계는 태그에 선언됩니다. 리본 태그의 구조는 두 가지 기본 노드 계층인 명령 및 리소스 트리와 트리를 통해 리본 컨트롤과 명령 간의 구분을 강조합니다.

리본에서 노출되는 모든 컨테이너 및 작업은 명령 및 리소스 트리에 선언됩니다. 각 Command 요소는 UI 디자인에 필요한 리소스 집합과 연결됩니다.

애플리케이션에 대한 명령을 만든 후 트리에서 컨트롤을 선언하고 각 컨트롤을 명령에 바인딩하여 명령 기능을 노출합니다. 리본 프레임워크는 여기에 선언된 컨트롤 계층 구조에 따라 컨트롤의 실제 위치를 결정합니다.

다음 코드 예제에서는 단추 컨트롤을 선언하고 종료 애플리케이션이라는 레이블을 지정하고 종료 명령과 연결하는 방법을 보여 줍니다.

<Application xmlns="http://schemas.microsoft.com/windows/2009/Ribbon">
  <Application.Commands>
    <Command Name="cmdExit" LabelTitle="Exit application" />
  </Application.Commands>

  <Application.Views>
    <Ribbon>
      <Ribbon.Tabs>
        <Tab>
          <Group>
            <Button CommandName="cmdExit" />
          </Group>
        </Tab>
      </Ribbon.Tabs>
    </Ribbon>
  </Application.Views>
</Application>
        

리본 태그 파일에 파일 이름 확장명을 사용할 수 있지만 .xml 설명서 전체에서 사용되는 권장 확장명입니다.

 

태그 컴파일

리본 태그 파일을 만든 후에는 Windows SDK(소프트웨어 개발 키트)에 포함된 리본 태그 컴파일러인 UI 명령 컴파일러(UICC)에 의해 이진 형식으로 컴파일되어야 합니다. 이 이진 파일에 대한 참조는 호스트 애플리케이션에서 리본 프레임워크를 초기화하는 동안 IUIFramework::LoadUI 메서드에 전달됩니다.

UICC는 명령줄 창에서 직접 실행하거나 Visual Studio에서 "사용자 지정 빌드 단계"로 추가할 수 있습니다.

다음 이미지는 Windows 7 SDK CMD 셸 창의 UICC 태그 컴파일러를 보여 줍니다.

명령줄 창에서 uicc.exe 보여 주는 스크린샷

다음 이미지는 Visual Studio에서 사용자 지정 빌드 단계로 추가된 UICC를 보여줍니다.

visual studio에서 사용자 지정 빌드 단계로 추가된 uicc.exe 보여 주는 스크린샷

UICC는 태그의 이진 버전(.bml), 태그 요소를 리본 호스트 애플리케이션에 노출하는 ID 정의 헤더(.h 파일), 컴파일 시 리본 이미지 및 문자열 리소스를 호스트 애플리케이션에 연결하는 리소스 정의 스크립트 (.rc 파일)의 세 가지 파일을 생성합니다.

리본 프레임워크 태그 컴파일에 대한 자세한 내용은 리본 태그 컴파일을 참조하세요.

응용 프로그램 빌드

리본 애플리케이션의 예비 UI가 태그에서 설계되고 구현되면 프레임워크를 초기화하고, 태그를 사용하고, 태그에 선언된 명령을 애플리케이션의 적절한 명령 처리기에 바인딩하는 애플리케이션 코드를 작성해야 합니다.

중요

리본 프레임워크는 COM 기반이므로 리본 프로젝트는 __uuidof() 연산자를 사용하여 IID(리본 프레임워크 인터페이스)에 대한 GUID를 참조하는 것이 좋습니다. microsoft 이외의 컴파일러를 사용하거나 호스트 애플리케이션이 C 기반인 경우와 같이 __uuidof() 연산자를 사용할 수 없는 경우 uuid.lib에 포함되지 않으므로 애플리케이션에서 IID를 정의해야 합니다.

애플리케이션에서 IID를 정의한 경우 UIRibbon.idl에 지정된 GUID를 사용해야 합니다.

UIRibbon.idl은 Windows SDK(소프트웨어 개발 키트) 의 일부로 배송되며 %ProgramFiles%\Microsoft SDKs\Windows\v7.0\Include의 표준 설치 경로에서 찾을 수 있습니다.

 

리본 메뉴 초기화

다음 다이어그램에서는 간단한 리본 애플리케이션을 구현하는 데 필요한 단계를 보여 줍니다.

간단한 리본 구현을 구현하는 데 필요한 단계를 보여 주는 다이어그램

다음 단계에서는 간단한 리본 애플리케이션을 구현하는 방법을 자세히 설명합니다.

  1. CoCreateInstance

    애플리케이션은 리본 프레임워크 클래스 ID를 사용하여 표준 COM CoCreateInstance 함수를 호출하여 프레임워크에 대한 포인터를 가져옵니다.

    IUIFramework* pFramework = NULL;
    HRESULT hr = ::CoCreateInstance(
                CLSID_UIRibbonFramework, 
                NULL,
                CLSCTX_INPROC_SERVER, 
                IID_PPV_ARGS(&pFramework));
    if (FAILED(hr))
    {
      return hr;
    }
    
  2. Initialize(hwnd, IUIApplication*)

    애플리케이션은 IUIFramework::Initialize를 호출하여 리본을 포함할 최상위 창에 대한 핸들과 프레임워크가 애플리케이션에 대한 콜백을 수행할 수 있도록 하는 IUIApplication 구현에 대한 포인터라는 두 개의 매개 변수를 전달합니다.

    ! [중요]
    리본 프레임워크는 STA(단일 스레드 아파트)로 초기화됩니다.

     

    hr = pFramework->Initialize(hWndHost, pApplication);
    if (FAILED(hr))
    {
      return hr;
    }
    
  3. LoadUI(instance, resourceName)

    애플리케이션은 IUIFramework::LoadUI 를 호출하여 태그 리소스를 바인딩합니다. 이 함수의 첫 번째 매개 변수는 리본 애플리케이션 instance 대한 핸들입니다. 두 번째 매개 변수는 이전에 컴파일된 이진 태그 리소스의 이름입니다. 리본 프레임워크에 이진 태그를 전달하면 애플리케이션은 리본 구조가 무엇인지, 컨트롤을 정렬해야 하는지를 알 수 있습니다. 또한 런타임에 명령 관련 콜백을 만들 때 프레임워크에서 사용하는 노출 명령 매니페스트(예: 붙여넣기, 잘라내기, 찾기)를 프레임워크에 제공합니다.

    hr = pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
    if (FAILED(hr))
    {
      return hr;
    }
    
  4. IUIApplication::OnCreateUICommand 콜백

    1~3단계가 완료되면 리본 프레임워크는 리본에 노출할 명령을 알 수 있습니다. 그러나 리본이 완벽하게 작동하기 전에 프레임워크에는 여전히 두 가지가 필요합니다. 명령이 실행될 때 애플리케이션에 알리는 방법과 런타임에 명령 리소스 또는 속성을 가져오는 방법입니다. 예를 들어 UI에 콤보 상자가 표시될 경우 프레임워크는 콤보 상자를 채울 항목을 요청해야 합니다.

    이러한 두 가지 기능은 IUICommandHandler 인터페이스를 통해 처리됩니다. 특히 이진 태그에 선언된 각 명령(위의 3단계 참조)에 대해 프레임워크는 IUIApplication::OnCreateUICommand 를 호출하여 애플리케이션에 해당 명령에 대한 IUICommandHandler 개체를 요청합니다.

    참고

    IUICommandHandler 인터페이스를 사용하면 명령 처리기를 하나 이상의 명령에 바인딩할 수 있습니다.

     

최소한 애플리케이션은 다음 예제와 같이 E_NOTIMPL 반환하는 IUIApplication 메서드 스텁을 구현해야 합니다.

STDMETHOD(OnViewChanged)(UINT32 viewId,
                         UI_VIEWTYPE typeID,
                         IUnknown *view,
                         UI_VIEWVERB verb,
                         INT32 uReasonCode)
{ 
  return E_NOTIMPL; 
}

STDMETHOD(OnCreateUICommand)(UINT32 commandId,
                             UI_COMMANDTYPE typeID,
                             IUICommandHandler **commandHandler)
{ 
  return E_NOTIMPL; 
}

STDMETHOD(OnDestroyUICommand)(UINT32 commandId,
                              UI_COMMANDTYPE typeID,
                              IUICommandHandler *commandHandler) 
{ 
  return E_NOTIMPL; 
}

이 시점에서 태그 리소스 파일은 애플리케이션 리소스 파일에 태그 리소스 정의 파일(태그 헤더 파일에 대한 참조 포함)에 대한 참조를 포함하여 호스트 애플리케이션에 연결되어야 합니다. 예를 들어 ribbonUI.rc라는 리소스 파일이 있는 RibbonApp이라는 애플리케이션에는 RibbonApp.rc 파일에 다음 줄이 필요합니다.

#include "ribbonUI.rc"

사용 중인 컴파일러 및 링커에 따라 리본 애플리케이션을 컴파일하기 전에 리소스 정의 스크립트를 컴파일해야 할 수도 있습니다. Microsoft Visual Studio 및 Windows SDK와 함께 제공되는 RC(리소스 컴파일러) 명령줄 도구를 이 작업에 사용할 수 있습니다.

애플리케이션 컴파일

리본 애플리케이션이 컴파일되면 실행되고 UI를 테스트할 수 있습니다. UI를 조정해야 하고 핵심 애플리케이션 코드에 연결된 명령 처리기가 변경되지 않은 경우 태그 원본 파일을 수정하고, 태그를 UICC.exe 다시 컴파일하고, 새 태그 리소스 파일을 연결합니다. 애플리케이션이 다시 시작되면 수정된 UI가 표시됩니다.

이 모든 것은 핵심 애플리케이션 코드를 건드리지 않고도 가능합니다. 이는 표준 애플리케이션 개발 및 배포보다 크게 향상되었습니다.

런타임 업데이트 및 실행

Ribbon 프레임워크의 런타임 통신 구조는 푸시 및 끌어오기 또는 양방향 호출자 모델을 기반으로 합니다.

이 모델을 사용하면 명령이 실행될 때 프레임워크가 애플리케이션에 알릴 수 있으며 프레임워크와 애플리케이션 모두 속성 값과 리본 리소스를 쿼리, 업데이트 및 무효화할 수 있습니다. 이 기능은 다양한 인터페이스 및 메서드를 통해 제공됩니다.

프레임워크는 IUICommandHandler::UpdateProperty 콜백 메서드를 통해 리본 애플리케이션에서 업데이트된 속성 정보를 가져옵니다. 업데이트할 Command 속성을 식별하는 명령 ID 및 속성 키는 메서드에 전달되고, 메서드는 해당 속성 키의 값을 프레임워크에 반환하거나 푸시합니다.

프레임워크는 명령이 실행될 때 IUICommandHandler::Execute 를 호출하여 명령 ID와 발생한 실행 유형(UI_EXECUTIONVERB)을 모두 식별합니다. 여기서 애플리케이션은 명령에 대한 실행 논리를 지정합니다.

다음 다이어그램에서는 프레임워크와 애플리케이션 간의 명령 실행에 대한 런타임 통신을 보여 줍니다.

리본 프레임워크와 호스트 애플리케이션 간의 런타임 통신 예제를 보여 주는 다이어그램

참고

IUICommandHandler::UpdatePropertyIUICommandHandler::Execute 함수를 구현하는 것은 애플리케이션에서 리본을 처음 표시할 필요가 없습니다. 그러나 이러한 메서드는 사용자가 명령을 실행할 때 애플리케이션이 올바르게 작동하도록 하는 데 필요합니다.

 

OLE 지원

리본 애플리케이션은 OLE 서버로 구성하여 현재 위치가 다른 OLE 활성화를 지원할 수 있습니다.

OLE 서버 애플리케이션에서 만든 개체는 OLE 클라이언트 애플리케이션(또는 컨테이너)에 삽입(붙여넣거나 배치)할 때 서버 애플리케이션과의 연결을 유지합니다. 외부 OLE 활성화에서 클라이언트 애플리케이션에서 개체를 두 번 클릭하면 서버 애플리케이션의 전용 instance 열리고 편집할 개체가 로드됩니다. 서버 애플리케이션을 닫으면 개체에 대한 모든 변경 내용이 클라이언트 애플리케이션에 반영됩니다.

참고

리본 프레임워크는 현재 위치 OLE 활성화를 지원하지 않습니다. 리본 기반 OLE 서버에서 만든 개체는 OLE 클라이언트 애플리케이션 내에서 편집할 수 없습니다. 서버 애플리케이션의 외부 전용 instance 필요합니다.

리본 태그를 사용하여 명령 및 컨트롤 선언

리본 메뉴 사용자 환경 지침

리본 디자인 프로세스