2007 Office Fluent Ribbon을 사용자 지정 (개발자 대상) (1부)

요약 : 2007 Office Fluent 사용자 인터페이스를 사용자 지정 방법을 설명합니다. 또, Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office system의 새로운 기능이 리본 사용자 설정 RAD 개발을 어떻게 지원하는지도 설명합니다.

Frank Rice, Microsoft Corporation

Ken Getz, MCW Technologies, LLC

발행 : 2006 년 5 월

업데이트 : 2006 년 10 월

적용 대상 : Microsoft Office Access 2007, Microsoft Office Excel 2007, Microsoft Office Outlook 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007, Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office system, Microsoft Visual Studio 2005

목차

  • 향상된 사용자 인터페이스

  • 사용자 경험을 향상시키는 새로운 방법

  • 기존 솔루션이란

  • Office 응용 프로그램의 Fluent UI 사용자 지정

  • 콜백 사용

  • Fluent UI 를 사용자 지정하는 두 가지 방법

  • 문서 기반의 추가기능을 Fluent UI 에 추가

  • Access 2007 UI 사용자 지정

  • Access 의 응용 프로그램 수준의 사용자 지정 리본 생성

  • 실행시에 사용자 설정 로드

  • 다른 응용 프로그램의 리본 사용자 설정 시나리오

  • COM 추가기능을 사용하여 Fluent UI 수정

  • 기존 명령 모음 추가기능 작업

  • 동적 Fluent UI 업데이트

  • 이미지 로드

  • 요약

향상된 사용자 인터페이스

2007 Microsoft Office system 의 응용 프로그램이 많은 새로운 형태가 적용되었습니다. 새로운 Microsoft Office Fluent 사용자 인터페이스 (UI)에 의해서 현재 계층형 메뉴, 도구 모음 및 작업창이 효율성 및 유용성 향상을 위해 최적화된 좀더 간단한 시스템으로 옮겨가고 있습니다. 이 새로운 Fluent UI 에는 향상된 바로 가기 메뉴나 힌트, 미니 도구 모음 및 키보드 바로 가기가 있어, 사용자의 효율성과 생산성을 향상시킵니다.

Note메모 :

Fluent UI 는 Microsoft Office Access 2007, Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007 등 여러가지 2007 Microsoft Office 응용 프로그램에서 구현됩니다. 리본은 Microsoft Office Outlook 2007에서 Outlook 아이템을 편집하고 있을 때도 사용할 수 있습니다. Fluent UI 를 사용자 지정하려면, Microsoft Visual Studio 로 지원되고 있는 Microsoft .NET Framework 기반의 언어와 XML 마크 업을 조합해 사용합니다. Microsoft Visual Basic for Applications (VBA), Microsoft Visual C++ 및 Microsoft Visual Basic 6.0 을 사용하여 사용자 지정하는 것도 가능합니다.

사용자 경험을 향상시키는 새로운 방법

개발자는 이전 버전의 Office 의 도구 및 프로그래밍 구조를 이용하여, 독창적인 방법으로 Fluent UI 를 확장해 왔습니다. 예를 들어, 명령 모음 개체 모델을 사용하여 사용자 지정 Office 응용 프로그램에서 풍부한 솔루션을 구축할 수 있습니다. 이 종래에서의 수법을 계승하여 사용자 경험을 향상시키기 위한 혁신적인 모델이 UI 확장성에 의해서 도입됩니다. Fluent UI 를 구성하는 구성요소는 확장 마크업 언어 (XML) 및 기존의 프로그래밍 언어 중 하나를  사용하여 조작합니다. XML 는 일반 텍스트이기 때문에 모든 텍스트 문자 편집기로 사용자 지정 파일을 생성할 수 있어 Fluent UI 를 간단하게 조작할 수 있습니다. 또, 각 응용 프로그램에서 같을 프로그래밍모델이 채택되어 최소한의 조정을 실시하여 사용자 지정 Fluent UI 파일을 재사용 할 수 있습니다.

그림 1. 2007 Office 응용 프로그램의 Fluent UI

리본 UI

XML 마크 업 파일을 사용하여 Fluent UI 를 사용자 지정하면, 명령 모음 개체 모델을 기반으로 한 복잡한 추가기능을 사용하는 필요성이 큰폭으로 줄어 듭니다. 다만, 이전 버전의 Office 대상으로 기술된 추가기능에 대해는 거의 또는 전혀 변경하지 않아도 Fluent UI에서 계속 동작합니다.

기존 솔루션이란

이전 버전의 Office에서는 명령 모음 개체 모델을 사용하여 Visual Basic 코드를 생성하여, 이 코드를 사용하여 Fluent UI 를 변경했습니다. 이 코드는 Office 2007에서도 계속 동작합니다. 또한 대부분의 경우, 변경이 필요없습니다. 다만, Microsoft Office 2003 의 도구 모음 변경은 [Add-Ins] 탭에 표시됩니다. 표시되는 사용자 지정의 종류는 추가기능의 원래의 설계에 따라서 다릅니다. 예를 들어, [Menu Commands] 그룹이 생성 되어 이 그룹에는 이전의 메뉴 구조 ([File] 메뉴, [Insert] 메뉴 및 [Tools] 메뉴)에 추가된 아이템이 포함됩니다. 또, [Toolbar Commands] 그룹이 생성되어 여기에 이전의 도구 모음 ([Standard] 도구 모음, [Formatting] 도구 모음 및 [Picture] 도구 모음)의 아이템이 포함됩니다. 추가기능 또는 문서에 의해서 추가되는 사용자 지정 도구 모음에 대해는 [Add-Ins] 탭의 [Custom Toolbar] 그룹에 표시됩니다.

Office 응용 프로그램의 Fluent UI 사용자 지정

다음의 방법을 사용하여 Word 2007, Excel 2007 또는 PowerPoint 2007에서 사용자 지정 응용 프로그램 수준의 Fluent UI를 생성할 수 있습니다.

  • 매니지 코드 및 언매니지드 코드로 COM 추가기능을 사용한다

  • .ppam 파일, .xlam 파일 등 응용 프로그램 고유의 추가기능을 사용한다

  • Word 2007에서 템플릿 (.dotm files)를 사용한다

Note메모 :

Access 2007 및 Outlook 2007 은 Office 응용 프로그램과는 약간 다른 방법으로 리본 사용자 설정을 구현합니다.

전형적인 시나리오에서는 COM 추가기능의 코드에는 외부 사용자 지정 파일 또는 코드 자체에 포함된 XML에서 XML 마크 업을 돌려주는 프로시저가 포함되어 있습니다. 응용 프로그램이 실행 되면, 추가기능은 XML 마크 업을 돌려주는 코드를 로드하여 실행합니다. 코드는 그 XML 마크 업을 XSD 스키마와 대조하여 유효성 검사하여 (옵션), 추가로 메모리에 로드하고, Fluent UI 에 적용합니다. 그리고, 변경된 Fluent UI 가 표시됩니다. Fluent UI 명령과 컨트롤에서는 추가기능의 코드의 실행에 콜백 프로시저도 사용할 수 있습니다.

문서 수준의 사용자 지정에서는 같은 XML 마크 업과.docx,.docm,.xlsx,.xlsm,.pptx 또는 .pptm 의 몇개의 확장자(extension)를 가지는 Office Open XML 파일 형식을 사용합니다. 이러한 솔루션에서는 XML 마크 업을 포함한 사용자 지정 파일을 생성하고, 폴더에 저장합니다. 다음에 Office Open XML 형식 컨테이너의 일부를 변경하고, 사용자 지정 파일을 지정합니다. Office 응용 프로그램에서 그 문서를 열면, 사용자 지정 파일이 메모리에 읽혀 Fluent UI 에 적용됩니다. 그리고, 명령과 컨트롤이 문서에 포함된 코드를 호출하여 기능을 제공합니다.

콜백 사용

콜백을 지정하고, 실행시에 Fluent UI에서 속성을 업데이트 하거나 조작을 실행합니다. 예를 들어, 리본 버튼을 클릭 했을 때에 발생하는 동작을 지정하려면, onAction 콜백 함수를 지정해야 합니다. RibbonX 마크 업은 다음과 같이 됩니다.

<button id="myButton" onAction="MyButtonOnAction" />

이 마크 업은 버튼을 클릭할 때 MyButtonOnAction 메서드를 호출하도록 Office 에 지시합니다. MyButtonOnAction 메서드에는 선택한 언어에 따라서 특정 서명(Signature)이 있습니다. 그 예를 다음에 보여줍니다.

public
void MyButtonOnAction (IRibbonControl control)
{
    if (control.Id == "myButton")
    {
        System.Windows.Forms.MessageBox.Show("Button clicked!");
    }
}
Note메모 :

어떻게 사용자 지정을 생성 했는지를 따라서 System.Windows.Forms 어셈블리 참조를 추가하여 MessageBox.Show 메서드를 호출해야하는 경우가 있습니다.

MyButtonOnAction 프로시저는 public 으로 선언 해야 합니다. control 매개 변수는 컨트롤 고유 식별자(dentifiers) 및 태그 속성을 가지고 있습니다. 이것에 의해 여러가지 컨트롤로 같을 콜백 프로시저를 사용할 수 있습니다.

Note메모 :

리본 XML 사용자 지정 마크 업의 특성의 대문자와 소문자는 camel 규약에 따라서 구분하여 사용할 수 있어 첫 단어를 제외하고 각 단어의 선두 문자가 대문자가 됩니다 (onAction,insertBeforeMso 등).

Fluent UI 를 사용자 지정하는 두 가지 방법

리본 지원 응용 프로그램에는 XML 마크 업을 사용하여 Fluent UI 를 사용자 지정하는 방법이 두 가지 있습니다. 다만, Access 2007 은 제외합니다. 이것에 대해는 다음에 설명합니다. 덧붙여 Outlook 의 경우는 COM 추가기능만이 Fluent UI 를 사용자 지정 할 수 있습니다. XML 마크 업에서 지정하는 변경은 모두 서서히 기존 Fluent UI 에 추가됩니다. 예를 들어, 사용자 지정 탭을 식별하는 XML 마크 업은 호스트 응용 프로그램의 기존 탭에 대해서 탭을 1 개만 추가합니다.

RibbonX 마크 업의 모든 컨트롤에 다음의 식별자(dentifiers)중 한쪽이 포함되지 않으면 안됩니다.

표 1 : 컨트롤로 사용하는 식별자(dentifiers) (모든 컨트롤에서  하나를 사용해야 합니다)

식별자(dentifiers) 설명

id

컨트롤 고유 식별자(dentifiers)를 지정합니다. 사용자 지정 컨트롤과 함께 사용합니다. 이 식별자(dentifiers)는 IRibbonControl 의 속성으로서 콜백 함수에게 건네집니다.

idMso

기본 제공 컨트롤 식별자(dentifiers)를 지정합니다.

idQ

한정 식별자(dentifiers)를 지정합니다. 다음 예와 같이, 선두에 네임 스페이스의 약어를 붙입니다.

<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui" xmlns:x="myNameSpace">
<button idQ="x:myButton" …/>
Note메모 :

이 예에서는 두가지 다른 추가기능을 같은 사용자 지정 그룹에 추가할 수 있도록 네임 스페이스 x 를 사용합니다. 이 추가기능은 수식명에 의해서 사용자 지정 그룹을 참조할 뿐입니다.

XML 마크 업 파일의 일반 서식

XML 마크 업을 사용하여 Fluent UI 를 사용자 지정 할 수 있습니다. 다음의 예는 Word 2007에서 Fluent UI 를 사용자 지정하는 XML 마크 업 파일의 일반 서식입니다. 다음의 예에서는 이 마크 업을 사용합니다.

<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab idMso="TabHome">
        <group idMso="GroupFont" visible="false" />
      </tab>
      <tab id="CustomTab" label="My Tab">
        <group id="SampleGroup" label="Sample Group">
          <toggleButton id="ToggleButton1" size="large"
            label="Large Toggle Button"
            getPressed="ThisDocument.MyToggleMacro"
            onAction="ThisDocument.MyActionMacro"  />
          <checkBox id="CheckBox1" label="A CheckBox"
            screentip="This is a check box"
            onAction="ThisDocument.MyCheckboxMacro" />
          <editBox id="EditBox1" getText="ThisDocument.MyTextMacro"
            label="My EditBox" onChange="ThisDocument.MyEditBoxMacro"/>
          <comboBox id="Combo1" label="My ComboBox"
            onChange="ThisDocument.MyComboBoxMacro">
            <item id="Zip1" label="33455" />
            <item id="Zip2" label="81611" />
            <item id="Zip3" label="31561" />
          </comboBox>
          <dialogBoxLauncher>
            <button id="Launcher1" screentip="My Launcher"
              onAction="ThisDocument.MyLauncherMacro" />
          </dialogBoxLauncher>
        </group>
        <group id="MyGroup" label="My Group" >
          <button id="Button1" label="My Large Button"
            size="large" onAction="ThisDocument.MyButtonMacro" />
          <button id="Button2" label="My Normal Button"
            size="normal" onAction="ThisDocument.MyOtherButtonMacro" />
        </group >
      </tab>
    </tabs>
  </ribbon>
</customUI>

이 XML 마크 업에 의해 다음 그림과 같이 Fluent UI 가 변경됩니다.

그림 2. Word 의 Fluent UI 사용자 지정의 예

Word 의 리본 UI 의 사용자 지정 예

이 예에서는 Word 2007 의 Fluent UI 를 다음에 보이는 순서로 변경합니다.

  1. XML 마크 업의 기본값의 네임 스페이스가 선언됩니다.

  2. 기본 제공 [Home] 탭의 기본 제공 [GroupFont] 그룹이 숨깁니다.

  3. 새로운 [CustomTab] 탭이 My Tab 라는 라벨이 붙은 마지막의 기본 제공 탭 우측으로 추가됩니다.

    Note메모 :

    id 식별자(dentifiers) 특성을 사용하여 사용자 지정 탭등의 사용자 지정 아이템을 생성합니다. idMso 식별자(dentifiers) 특성을 사용하여 [TabHome] 탭등의 기본 아이템을 참조합니다.

  4. 새로운 [SampleGroup] 그룹이 [My Tab] 탭에 추가됩니다.

  5. 큰 크기의 [ToogleButton1] 버튼이 [My Group] 그룹에 추가됩니다. 마크 업에 의해서 onAction 콜백 및 getPressed 콜백이 지정됩니다.

  6. [CheckBox1] 체크 박스가 사용자 지정 힌트와 함께 [My Group] 그룹에 추가됩니다. 또, onAction 콜백도 지정됩니다.

  7. [EditBox1] 편집 상자가 [My Group] 그룹에 추가되어 onChange 콜백이 지정됩니다.

  8. [Combo1] 박스가 3 개의 아이템과 함께 [My Group] 그룹에 추가되어 onChange 콜백이 지정됩니다.

  9. [Launcher1] 실행 도구가 [My Group] 그룹에 추가되어 onAction 콜백이 설정 됩니다.

    일반적으로 실행 도구는 사용자 지정 대화상자를 표시해 보다 많은 옵션을 사용자에 제시합니다.

  10. 새로운 [My Group] 그룹이 사용자 지정 탭에 추가됩니다.

  11. 큰 크기의 [Button1] 버튼이 [My Group] 그룹에 추가되어 getText 콜백 및 onAction 콜백이 지정됩니다.

  12. 표준 크기의 [Button2] 버튼이 [My Group] 그룹에 추가되어 onAction 콜백이 지정됩니다.

RibbonX 마크 업은 유효성 검사 XML 편집기로 생성하는 것이 가장 간단합니다. Microsoft Visual Studio 2005 에는 이러한 편집기가 준비 되어, 필요한 스키마 (XSD) 파일이 있으면 사용할 수 있습니다. 이 경우, customUI.xsd 의 현재 버전이 필요하지만, 이것은 여러 장소에서 이용 가능합니다. 예를 들어, 이 스키마는 Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office system (Visual Studio 2005 Tools for Office Second Edition)를 설치 할 경우에 Visual Studio 스키마 카탈로그에 추가되어 기본적으로 Visual Studio 프로젝트에서 이용 가능합니다. 또, 「Microsoft Office Developer Center: Ribbon (영어)」Web 사이트에서 입수할 수도 있습니다. Visual Studio 로 새로운 XML 파일을 생성하면, 속성창에서 customUI.xsd 파일을 포함하도록 Schemas 속성을 설정합니다 (또는 이전 XML 문서와 같이, 코드에 스키마 참조를 입력합니다).그리고, XML 컨텐츠를 파일에 입력하면, Microsoft IntelliSense 기술을 이용할 수 있습니다. 또, XML Notepad 2006 도 편리합니다. 이것은 「Microsoft 다운로드 센터」에서 이용 가능합니다. 이 도구를 사용하면, 트리 형식에서 XML 컨텐츠를 편집 및 표시할 수 있습니다.

Office Open XML 형식의 파일을 사용한 Fluent UI 사용자 지정

문서 수준으로 XML 마크 업을 사용하여 Fluent UI 를 사용자 지정하는 순서를 다음에 보여줍니다. 자세한 내용은 후의 「문서 기반의 추가기능을 Fluent UI 에 추가」르 참조해 주세요. 이 순서에서는 이전 섹션에서  설명한 XML 마크 업을 사용합니다.

Note메모 :

Office Open XML 형식 구조 동작을 파악하면 편리하지만, 이 순서는 생략할 수 있습니다. OpenXMLDeveloper.org에서 Custom Fluent UI Editor 를 이용하면, 문서를 열고, 사용자 지정 UI 를 삽입하고  RibbonX 마크 업에서 적절한 장소에 문서를 저장 할 수 있습니다. 이 예로 보이는 순서는 이 도구에 의해서 실행됩니다. 또, 사용자 지정 아이콘을 customUI 폴더에 추가하여 그 아이콘을 간단하게 참조하는 것도 가능합니다. 이 Custom UI Editor 는 OpenXMLDeveloper.org 의 「Custom UI Editor Tool (영어)」Web 페이지에서 다운로드할 수 있습니다.

Office Open XML 형식의 파일을 사용한 Fluent UI 를 사용자 지정하려면

  1. 데스크톱에 customUI 라는 이름의 폴더를 생성합니다.

  2. 임의의 텍스트 문자 편집기로 새로운 구성요소를 Fluent UI 에 추가하고, 기존 구성요소를 변경하거나 구성요소를 보이지 않도록 XML 마크 업을 기술하고, 사용자 지정 파일을 생성합니다. 이전 예로 나타내 보인 XML 마크 업을 사용하면, 동작을 테스트 할 수 있습니다. 파일을 customUI.xml 로서 (또는 다른 임의의 이름), 생성한 폴더에 저장합니다.

  3. XML 마크 업을 사용자 지정 Fluent UI 스키마에 대조해 유효성 검사합니다 (옵션).

  4. Office 응용 프로그램에서 문서를 생성하여, Office Open XML 형식으로서 저장합니다. 확장자(extension)는 .docx,.docm,.xlsx,.xlsm,.pptm,.pptx 의 어느 쪽인가에 됩니다.

    매크로가 포함된 파일의 파일명확장 자식에는 접미사 "m" 가 붙습니다. 이러한 파일에는 RibbonX 명령 및 컨트롤로 호출할 수 있는 프로시저를 포함할 수 있습니다.

    Caution note주의 :

    사용자에 의한 리본 사용자 설정 조작에 대응하는 코드를 추가 해야 하며, 이 경우는 매크로 유효 형식으로 문서를 저장해야 합니다. 이 기능을 갖춘 문서에는 .docm,.xlsm 및 .pptm 형식이 있습니다. 이 문서에서 소개하는 Microsoft Visual Basic for Applications (VBA) 코드를 포함한 모든 예에 대해 이들 형식 중 하나의 형식으로 호스트 문서를 저장해 주세요.

  5. Office 응용 프로그램을 종료합니다.

  6. Microsoft Windows 탐색기에서 파일명확장 자식**.zip** 을 문서 파일 이름에 추가하여 그 파일을 더블 클릭하여 압축 폴더로서 엽니다.

  7. [customUI] 폴더를 데스크톱에서 압축 폴더에 드래그하여, 사용자 지정 파일을 컨테이너에 추가합니다.

  8. [_rels] 폴더를 데스크톱에 드래그 합니다. .rels 파일이 포함된 _rels 라는 이름의 폴더가 데스크톱에 표시됩니다.

  9. 새로운 폴더를 열어, 텍스트 문자 편집기로 .rels 파일을 엽니다.

  10. 마지막의**<Relationship>** 요소와 종료**<Relationships>** 요소의 사이에 문서 파일과 사용자 지정 파일 사이의 관계를 생성하는 행을 추가합니다. 폴더명과 파일 이름은 반드시 올바르게 지정해 주세요 (Id 특성에 의해 customUI 의 관계 ID (임의의 값)가 지정됩니다).

    <Relationship Type="https://schemas.microsoft.com/office/2006/
      relationships/ui/extensibility" Target="/customUI/customUI.xml"
      Id="customUIRelID" />
    
  11. .rels 파일을 저장합니다.

  12. .rels 파일을 데스크톱에서 압축 파일의 [_rels] 폴더에 드래그하여, 기존 .rels 파일과 옮겨놓습니다.

  13. .zip 확장자(extension)를 컨테이너파일에서 삭제합니다.

Office 응용 프로그램에서 파일을 열면, 사용자 지정 된 UI 가 표시됩니다. 이 예의 이전 섹션에서  채택한 마크 업을 사용하면, 응용 프로그램의 설정에 따라서는 문서를 열었을 때에 경고메시지가 표시될 수 있습니다. 지금까지 지정한 코드는 다양한 콜백 프로시저에 대응하는 것은 아닙니다. 따라서 생성된 사용자 지정 UI 는 아직 완전하지는 않습니다.

문서 기반의 추가기능을 Fluent UI 에 추가

사용자 지정 매크로를 호출할 수 있어 Excel 2007 의 간단사용자 지정 UI 가 포함된 문서를 생성하는 기본적인 순서를 다음에 보여줍니다.

  1. Excel 매크로 유효 통합문서를 생성하여, 매크로를 1 개 설정합니다.

  2. 파일을 생성하여, 그 파일에 1개의 탭, 1 개의 그룹 및 1 개의 버튼을 추가해 사용자 지정 합니다.

  3. 버튼을 클릭할 때 Fluent UI 에 의해서 호출된 프로시저를 VBA 로 생성합니다.

  4. 버튼의 마크 업에서 onAction 콜백 특성을 지정합니다. 이것에 의해 문서로 생성한 매크로가 호출됩니다.

  5. 매크로 유효 문서 컨테이너의 컨텐츠를 변경하여, Fluent ID 를 사용자 지정하는 파일을 추가합니다.

  6. 매크로 유효 파일을 저장하여 Excel 2007에서 엽니다. 

Note메모 :

Word 또는 PowerPoint 의 매크로 유효 문서를 생성할 때도 이것과 같은 기본순서에 따를 수 있습니다.

Excel 매크로 유효 통합문서 생성

  1. Excel 2007 을 실행 합니다.

  2. [Developer] 탭을 클릭하고 [Visual Basic] 를 클릭합니다.

    Note메모 :

    [Developer] 탭이 표시되지 않는 경우는 개발자가  직접 확인해야 합니다. 응용 프로그램에서 이 조작을 실시하려면, Microsoft Office 버튼,[Application Options], [Popular] 의 순서에 클릭하고 [Show Developer Tab in the Ribbon] 을 선택합니다. 이것은 Fluent UI 를 구현하는 모든 Office 응용 프로그램에서 자신을 개발자로서 인정하는 글로벌 설정입니다.

  3. Visual Basic Editor에서 ThisWorkbook 를 더블 클릭하여 코드 윈도우를 엽니다.

  4. 다음의 VBA 함수를 입력하고 나서 도구 모음의 좌우에 있는 [Excel] 아이콘을 클릭하여 Excel 로 돌아옵니다.

    Sub MyMacro(ByVal control as IRibbonControl)
       MsgBox("Hello World")
    End Sub
    
  5. 파일명확장 자식이 .xlsm 의 매크로 유효 통합문서로서 문서를 저장합니다.

    Note메모 :

    표준의 .xlsx 문서로서 저장하면, 매크로 코드를 실행할 수 없게 됩니다. 문서를 저장 할 때는 [Save As] 메뉴옵션을 명시적으로 선택하여  [Excel 매크로 유효 통합문서 (*.xlsm)] 를 선택합니다.

  6. Excel 를 종료합니다.

XML 마크 업을 포함한 파일을 생성하여, Fluent UI 변경

  1. 데스크톱에 customUI 라는 이름의 폴더를 생성합니다.

  2. 새로운 텍스트 파일을 생성하여, 다음의 XML 를 추가하고, 그 파일을 데스크톱의 [customUI] 폴더에 customUI.XML 로 저장합니다.

    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
      <ribbon startFromScratch="true">
        <tabs>
          <tab id="CustomTab" label="My Tab">
            <group id="SimpleControls" label="My Group">
              <button id="Button1" imageMso="HappyFace" size="large"
                label="Large Button"
                onAction="ThisWorkbook.MyMacro" />
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>
    

매크로 유효 파일의 컨테이너 포함 파일 변경

  1. Windows 탐색기에서 생성한 매크로 유효 파일을 찾아냅니다. .zip 확장자(extension)를 추가하고, 파일 이름을 변경합니다.

  2. Windows 탐색기에서 파일을 더블 클릭하여 엽니다.

  3. [customUI] 폴더를 데스크톱에서 압축 폴더에 드래그하여, 메시지의 지시에 따라서 [Add] 를 클릭하고, 사용자 지정 파일을 컨테이너에 추가합니다.

  4. [_rels] 폴더를 데스크톱에 드래그 합니다.

  5. 새로운 폴더를 열어, 텍스트 문자 편집기로 .rels 파일을 엽니다.

  6. 마지막의 <Relationship> 요소와 </Relationships> 요소의 사이에 다음의 텍스트를 추가하여 파일을 저장하고 닫습니다.

    <Relationship Id="customUIRelID" Type="https://schemas.microsoft.com/office/2006/relationships/ui/extensibility"
    Target="customUI/customUI.xml" />
    
  7. .rels 파일을 데스크톱에서 압축 파일의**_rels** 폴더에 드래그하여, 기존 .rels 파일과 옮겨놓습니다.

  8. .zip 확장자(extension)를 컨테이너파일 이름에서 삭제합니다.

  9. Excel 2007에서 매크로 유효 파일을 엽니다. 사용자 지정 UI 에 의해서 기본 제공 Fluent UI 를 옮겨놓을 수 있습니다.

    Note메모 :

    보안 설정에 따라서는 매크로가 무효가 된것을  통지하는 보안 경고가 표시되는 일이 있습니다. 그 경우는 경고의 옆에 표시되는 [Options] 을 클릭하고 [Enable this content] 을 선택하고,[OK] 를 클릭합니다.

  10. [Large Button] 을 클릭합니다. 버튼을 클릭하면, onAction 콜백이 트리거 됩니다. 이것에 의해 통합문서의 매크로를 호출하여 "Hello World" 라는 메시지가 표시됩니다.

COM 추가기능에서 Fluent UI 사용자 지정

응용 프로그램 수준으로 사용자 지정하면, 문서가 열려 있는지와 관계없이 응용 프로그램에 표시되는 Fluent UI 가 변경됩니다. 이러한 변경에는 일반적으로는 COM 추가기능을 사용합니다. COM 추가기능은 일반적으로 매니지 코드를 사용하여 두 가지 방법으로 생성할 수 있습니다. 한가지는 Visual Studio 2005 의 [Shared Add-In] 템플릿을 사용하는 방법, 다른 하나는 Visual Studio 2005 Tools for Office Second Edition을 사용하는 방법입니다. 덧붙여 후자의 방법이 간단하게 추가기능을 생성할 수 있습니다. 다음 순서에서는 리본을 사용자 지정하는 COM 추가기능의 기본이 되는 메서드 calling sequence를 설명합니다. 어느 방법으로 추가기능을 생성 해도 그 개념에 변화는 없지만, 기술해야 할 구체적인 코드는 달라집니다. 이것은 이 문서의 뒷부분에서 설명합니다.

COM 추가기능을 사용하여 Fluent UI 를 사용자 지정

  1. COM 추가기능 프로젝트를 생성합니다.

    생성 추가기능은 Extensibility.IDTExtensibility2 인터페이스 및 IRibbonExtensibility 인터페이스 (Microsoft.Office.Core 네임 스페이스에 있음)를 구현해야 합니다.

  2. 추가기능 및 Setup 프로젝트를 구축하고 프로젝트를 설치합니다.

  3. Office 응용 프로그램을 실행 합니다.

이전 버전의 Office 와 같이 추가기능의 로드 때에는 IDTExtensibility2::OnConnection 이벤트가 호출되어  추가기능이 초기화됩니다.

Office 에 의해 QueryInterface 메서드 (언매니지드 추가기능 용) 또는 QueryService 메서드 (매니지 추가기능 용무)중 한쪽이 호출됩니다. 이 메서드는 추가기능이 IRibbonExtensibility 인터페이스를 구현할지 결정합니다. 구현하는 경우는 IRibbonExtensibility::GetCustomUI 메서드가 호출됩니다. 이 메서드는 XML 마크 업을 (XML 사용자 지정 파일 또는 프로시저에 파묻힌 XML 마크 업에서)  반환하고, 사용자 지정된 Fluent UI 가 응용 프로그램에 로드됩니다. 그리고, 사용자 지정 된 UI 를 사용자를 이용할 수 있습니다.

Caution note주의 :

리본 콜백 메커니즘의 내부 아키텍처 때문에 GetCustomUI 메서드내에는 리본의 XML 마크 업을 준비해 돌려주는 이외의 초기화 작업을 실시하지 않는 것이 중요합니다. 특히, 대화상자 또는 메시지창은 콜백 메서드내에는 표시하지 마세요.

XML 마크 업에서 지정된 각 컨트롤에서는 콜백 프로시저에의 호출에 의해서 기능이 공개됩니다. 예를 들어, 버튼 컨트롤 XML 마크 업은 사용자가 버튼을 클릭 했을 때에 실행되는 프로시저를 가리키는 onAction 특성을 지정할 수 있습니다. 콜백 프로시저는 대부분의 경우, 컨트롤을 식별하는 IRibbonControl 인터페이스를 공개합니다. 또, 콜백은 다른 인수, 예를 들어 토글 버튼 상태 (누른 상태 또는 누르지않은 상태)를 지정하는 개체 등을 건네주기도 합니다. IRibbonControl 인터페이스는 Context 개체, Id 개체, Tag 속성의 세가지 속성을 구현합니다. Context 개체는 콜백을 트리거하는 리본이 포함된 액티브 윈도우입니다. Id 개체는 마크 업에서 지정된 사용자 지정 컨트롤 문자열 식별자(dentifiers)입니다. Tag 속성은 고유 대신, 옵션으로 마크 업을 지정할 수 있습니다.

Access 2007 UI 사용자 지정

Access 2007 RibbonX 를 사용자 지정 할 때의 옵션 안에는 다른 응용 프로그램과 같이 공유되지만, 중요한 차이도 몇가지 있습니다. 다른 응용 프로그램과 같이 Access 의 Fluent UI 는 XML 마크 업을 사용하여 사용자 지정 할 수 있습니다. 다른 응용 프로그램과 같이 XML 마크 업을 포함한 외부파일 또는 COM 추가기능을 사용하여 리본 사용자 설정을 응용 프로그램에 통합합니다. 다만, 다른 Office 응용 프로그램 과는 달리, Access 데이터베이스 파일은 이진으로 Office Open XML 형식에서 열릴 수 없기 때문에 부분적으로 데이터베이스 파일에 추가하는 것으로 Access 리본을 사용자 지정 할 수 없습니다.

Access에서는 유연하게 Fluent UI 를 사용자 지정 할 수 있습니다. 예를 들어, 사용자 지정 마크 업을 테이블에 저장 하거나 VBA 프로시저에 묻거나 다른 Access 데이터베이스에 저장 하거나 할 수 있습니다. 또, Excel 워크시트에서 링크하는 것도 가능합니다. 응용 프로그램의 사용자 지정 UI 를 전체적으로 또는 특정 폼 또는 리포트를 지정할 수도 있습니다.

다음에 소개하는 시나리오는 Access UI 를 사용자 지정 할 때의 참고로서 사용하여 주세요.

Note메모 :

여기서 소개하는 튜토리얼에서는 데이터베이스에 대해서 변경을 추가해야 합니다. 따라서 이러한 순서는 운용 데이터베이스가 아닌 예를 들어 예제데이터베이스의 백업카피를 사용하여 실행하도록 해 주세요.

Access 의 Fluent UI 사용자 지정

Access UI 의 사용자 지정은 두 가지 방법으로 실행 가능합니다. 첫번째는 사용자 지정을 특별한 테이블에 저장하고 Access 로 마크 업을 자동적으로 로드하는 방법입니다. 다른 하나는 사용자 지정을 저장하는 장소를 선택하여 Application.LoadCustomUI 메서드를 호출하는 것으로 마크 업을 수동으로 로드하는 방법입니다.

Access 로 사용자 지정을 자동적으로 로드하는 경우는 USysRibbons 라는 이름의 테이블에 사용자 지정을 저장해야 합니다. 이 테이블에는 2 개의 열이 있습니다. 한가지는 RibbonName 이라는 이름의Text 열로 이 열에는 255 문자를 저장 할 수 있습니다. 다른 하나는 RibbonXML 라는 이름의 Memo 열입니다. 리본명은 RibbonName 열에 리본 마크 업은 RibbonXML 열에 입력합니다. 데이터베이스를 닫았다가 다시 열면, [Access 의 속성] 대화상자로 사용하는 기본값 리본을 선택할 수 있습니다. 여기에서는 임의의 폼 또는 리포트 선택시에 표시되는 리본을 그 폼 또는 리포트 속성으로서 선택할 수 있습니다.

보다 동적인 방법을 사용하는 경우는 LoadCustomUI 메서드를 호출합니다. 이 메서드는 XML 컨텐츠가 테이블에 저장 되는지 어떤지에 관계없이 리본 사용자 설정을 로드합니다.LoadCustomUI를 호출하여 사용자 설정을 로드하면, 지정한 사용자 설정을 실행시에 프로그램에 의해서 매핑해야 합니다.

Note메모 :

LoadCustomUI 메서드를 사용하여 로드한 사용자 설정은 데이터베이스가 열려 있을 때만 사용할 수 있습니다. 따라서 데이터베이스[Ribbon and Toolbar Options 를 열 때마다 LoadCustomUI를 호출해야 합니다. 이 방법은 실행시에 사용자 지정 UI 를 매핑해야 하는 응용 프로그램에 도움이 됩니다.

LoadCustomUI 메서드의 서명을 다음에 보여줍니다.

expression .LoadCustomUI(CustomUIName As String, CustomUIXML As String)

expression Application 개체를 반환합니다.

CustomUIName은 이 마크 업에 관련지을 수 있는 사용자 지정 리본 ID 이름입니다.

CustomUIXML 에는 XML 사용자 지정 마크 업이 포함됩니다.

LoadCustomUI 메서드의 사용 예는 다음에 소개합니다.

다음 순서에서는 일반화된 방법으로 Access 에 응용 프로그램 수준의 사용자 지정을 추가합니다. 완전한 가이드에 대해 다음 섹션에서  소개합니다.

사용자 지정 된 응용 프로그램 수준의 리본을 디자인 적용

  1. USysRibbons 라는 이름의 테이블을 생성하여, 앞에서 설명한 열을 생성합니다. 사용 가능하게 하는 리본 마다 행을 추가합니다.

  2. 데이터베이스를 닫고 다시 로드합니다.

  3. Microsoft Office 버튼을 클릭하고 [Access Options] 을 클릭합니다.

  4. [Ribbon and Toolbar Options] 섹션에서  [Current Database] 을 클릭하고 [Ribbon Name] 박스 목록으로 리본 한쪽을 클릭합니다.

기존 사용자 설정을 삭제하고, 데이터베이스가 기본값 Fluent UI 를 사용하도록  설정하려면, [Ribbon Name] 박스 목록에서 기존 리본명을 삭제하고 그대로 아무것도 지정하지 않고 비어 있는 상태로 둡니다.

다음 순서에서는 일반화된 방법으로 Access 에 폼 수준 또는 리포트 수준의 사용자 지정을 추가합니다.

특정 사용자 지정 리본을 폼 또는 리포트 매핑

  1. 앞에서 설명한 순서에 따라서 USysRibbons 테이블을 추가하여 사용자 지정 된 리본을 응용 프로그램에서 사용할 수 있도록 합니다.

  2. 디자인 보기로 폼 또는 리포트를 엽니다.

  3. [Design] 탭에서 [Property Sheet] 를 클릭합니다.

  4. 속성창의 [Other] 탭에서 [Ribbon Name] 박스 목록의 리본 한쪽을 클릭합니다.

  5. 폼 또는 리포트를 저장한 후 닫았다가 다시 엽니다. 선택한 UI 가 표시됩니다.

    Note메모 :

    Fluent UI 에 표시되는 탭은 부가적인 것입니다. 즉, 탭을  숨기지 않는 이상 또는 Start from Scratch 특성을 True 로 설정하지 않는 한, 폼 또는 리포트의 UI 에 의해서 표시되는 탭은 기존 탭과 함께 표시됩니다.

이 순서를 한층 더 자세하게 확인하려면, 다음 예를 실행해 주세요.

이 예의 전반부에서는 사용자 지정 UI 를 로드할 때 발생한 오류를 리포트하는 옵션을 설정합니다 (여기에서는 Access 로 순서를 실행하고 있지만, 같은 순서를 다른 응용 프로그램에서 실행할 수도 있습니다).

Access 의 응용 프로그램 수준의 사용자 지정 리본 생성

Access 의 응용 프로그램 수준의 사용자 지정 리본 생성

  1. Access 를 실행 합니다. 기존 데이터베이스를 열거나, 새로운 데이터베이스를 생성합니다.

  2. Microsoft Office 버튼을 클릭하고 [Access Options] 을 클릭합니다. 그리고 [Advanced] 탭을 클릭합니다.

  3. [General] 섹션에서 [Show add-in user interface errors] 을 클릭합니다 (이 옵션의 장소는 응용 프로그램에 따라서 다릅니다.).

  4. [OK] 를 클릭하여 [Access Options] 대화상자를 닫습니다.

    다음에 사용자 지정 XML 마크 업이 포함된 테이블을 생성합니다.

  5. Access 로 데이터베이스를 연 채로 탐색창을 오른쪽 클릭합니다. [Navigation Options] 에서 [시스템 개체의 표시] 를 클릭합니다. (탐색 페인에 USysRibbons 테이블을 표시하려면, 이 옵션을 설정해야 합니다. ) [OK] 를 클릭하고, 대화상자를 닫습니다. Access 시스템표가 탐색창에 표시됩니다.

  6. [Create] 탭에서  [Table Design] 을 클릭합니다.

  7. 다음의 필드를 테이블에 추가합니다.

    표 2. USysRibbons 테이블의 필드 정의

    필드이름 종류

    ID

    일련 번호형

    RibbonName

    텍스트형

    RibbonXml

    메모 형식

  8. ID 필드를 선택합니다. [Design] 탭에서 [Primary Key] 를 선택합니다.

  9. Microsoft Office 버튼을 클릭하고 [Save] 을 클릭합니다. 새로운 테이블에 USysRibbons 라는 이름을 붙입니다.

  10. [USysRibbons] 탭을 오른쪽 클릭하고 [Datasheet View] 를 클릭합니다.

  11. 생성한 필드에 다음의 데이터를 추가합니다.

    표 3. USysRibbons 테이블의 데이터

    필드이름

    ID

    (일련 번호형)

    RibbonName

    HideData

    RibbonXml

    
    

    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui"> <ribbon startFromScratch="false"> <tabs> <tab idMso="TabCreate" visible="false" /> <tab id="dbCustomTab" label="A Custom Tab" visible="true"> <group id="dbCustomGroup" label="A Custom Group"> <control idMso="Paste" label="Built-in Paste" enabled="true"/> </group> </tab> </tabs> </ribbon> </customUI>

    이 마크 업에 의해 **startfromScratch** 특성이 **False**로 설정되어 기본 제공 \[Create\] 탭을 숨깁니다. 그리고, 사용자 지정 탭과 사용자 지정 그룹이 생성되어 기본 제공인 \[Paste\] 컨트롤이 그룹에 추가됩니다.
    1. 테이블을 닫습니다.

    2. 데이터베이스를 닫고, 다시 엽니다.

    3. Microsoft Office 버튼을 클릭하고 [Access Options] 을 클릭합니다.

    4. [Current Database] 탭을 클릭하여 아래에 스크롤하여,  [Ribbon and Toolbar Options] 섹션을 표시합니다.

    5. [Ribbon Name] 박스 목록의 [HideData] 를 클릭합니다. [OK] 를 클릭하고, 대화상자를 닫습니다.

    6. 데이터베이스를 닫았다가 다시 엽니다.

      [Edit] 그룹은 표시되지 않고, Fluent UI 에는 [ A Custom Tab] 탭이 표시됩니다. 이 탭에는 [A Custom Group] 그룹과 [Built-in Paste] 버튼이 있습니다.

      그림 3. Access 의 응용 프로그램 수준의 UI

      Access 응용 프로그램 수준의 리본 UI

    7. 클린업 하려면, 앞의 순서를 몇 번 반복하여  [Access Options] 대화상자를 표시합니다. [Ribbon Name] 옵션의 내용을 삭제한 후 데이터베이스를 닫았다가 다시 열면, 기본값 Fluent UI 가 표시됩니다.

      Note메모 :

      USysRibbons 테이블의 리본을 사용하여 특정 폼 또는 리포트를 UI 를 지정하는 것도 가능합니다. 이것을 실시하려면, 디자인 모드 또는 레이아웃 모드로 폼을 열어, 폼의RibbonName 속성을 사용하는 리본 이름으로 설정합니다. 이 속성을 설정하려면, 폼 컨트롤 또는 섹션 대신 폼 자체를 선택해야 합니다.

    실행시에 사용자 설정 로드

    실행시에 정적인 사용자 설정을 로드하려면, USysRibbons 테이블에 그 사용자 설정을 저장하여, 필요에 따라서 폼 또는 리포트 RibbonName 속성을 설정합니다. 다만, 동적인 사용자 설정을 생성해야 하는 경우는 Application.LoadCustomUI 메서드를 호출합니다. 다음의 예에서는 응용 프로그램의 각 폼에 버튼을 표시하는 리본 사용자 설정을 생성하여, 버튼 마다 onAction 콜백을 처리하고, 요청된 폼을 로드합니다.

    동적 리본 사용자 설정 생성

    1. 이전 섹션에서  작업하고 있던 데이터베이스를 Access 2007 에 로드합니다. 데이터베이스에 여러가지 폼이 없는 경우는 새로운 폼을 생성하여, 하나 또는 2 개의 컨트롤을 각 폼에 추가합니다.

    2. [Create] 탭의 [Other] 그룹에서 [Macro] 버튼의 드롭 다운 목록을 클릭하여 [Module] 을 클릭합니다.

    3. Visual Basic Editor에서 [View] 메뉴의 [Properties Window] 를 클릭합니다.

    4. 속성창의 Name 속성 박스로 모듈의 이름을 RibbonLoader 로 변경합니다.

    5. 코드 윈도우에서 다음 코드를 삽입합니다. 이 메서드는 값을 돌려주지 않더라도 이것은 함수여야 합니다. 그렇지 않은 경우, Access 매크로로 호출할 수 없습니다.

      Function CreateFormButtons()
        Dim xml As String
        xml = _
         "<customUI https://schemas.microsoft.com/" & _
         "office/2006/01/customui"">" & vbCrLf & _
         "  <ribbon startFromScratch=""false"">" & vbCrLf & _
         "    <tabs>" & vbCrLf & _
         "      <tab id=""DemoTab"" label=""LoadCustomUI Demo"">" & _
           vbCrLf & _
         "        <group id=""loadFormsGroup"" label=""Load Forms"">" & _
           vbCrLf & _
         "{0}" & vbCrLf & _
         "        </group>" & vbCrLf & _
         "      </tab>" & vbCrLf & _
         "    </tabs>" & vbCrLf & _
         "  </ribbon>" & vbCrLf & _
         "</customUI>"
      
        Dim template As String
        template = "<button id=""load{0}Button"" " & _
         "label=""Load {0}"" onAction=""HandleOnAction"" " & _
         "tag=""{0}""/>" & vbCrLf
      
        Dim formContent As String
        Dim frm As AccessObject
        For Each frm In CurrentProject.AllForms
          formContent = formContent & _
           Replace(template, "{0}", frm.Name)
        Next frm
      
        xml = Replace(xml, "{0}", formContent)
        Debug.Print xml
        On Error Resume Next
        ' If you call this code from the AutoExec macro,
        ' the only way it can fail is if you have a
        ' customization with the same name in the
        ' USysRibbons table.
        Application.LoadCustomUI "FormNames", xml
      End Function
      

      응용 프로그램에 Form1 및 Form2 의 2 개의 폼이 포함된 경우, 코드를 실행하면, 다음의 XML 와 같은 마크 업이 생성됩니다.

      <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
        <ribbon startFromScratch="false">
          <tabs>
            <tab id="DemoTab" label="LoadCustomUI Demo">
              <group id="loadFormsGroup" label="Load Forms">
                <button id="loadForm2Button" label="Load Form2"
                  onAction="HandleOnAction" tag="Form2"/>
                <button id="loadForm1Button" label="Load Form1"
                  onAction="HandleOnAction" tag="Form1"/>
              </group>
            </tab>
          </tabs>
        </ribbon>
      </customUI>
      

      이 마크 업에 의해 새로운 [LoadCustomUI Demo] 탭이 생성됩니다. 이 탭에는 [Load Forms] 그룹이 포함됩니다. 그 그룹에는 응용 프로그램의 폼 (Form1 및 Form2) 마다 버튼이 표시되어 버튼을 클릭할 때 HandleOnAction 콜백 프로시저가 호출되어야 함을 보여줍니다. 또한 이 마크 업은 코드를 여는 Access 폼의 이름이 버튼에 나타나도록  각 버튼의 Tag 특성을 설정합니다.

    6. 다음의 프로시저를 같은 모듈에 추가합니다. 이 프로시저는 콜백 동작을 지정합니다. 이 코드에서는 선택된 폼을 열어, 리본 사용자 설정에서 RibbonName 속성을 FormNames으로 설정합니다.

      Public Sub HandleOnAction(control As IRibbonControl)
          ' Load the specified form, and set its
          ' RibbonName property so that it displays
          ' the custom UI.
          DoCmd.OpenForm control.Tag
          Forms(control.Tag).RibbonName = "FormNames"
      End Sub
      
    7. 데이터베이스를 저장하고  Visual Basic Editor 를 닫습니다.

    8. 응용 프로그램에는 적어도 폼이 두개 필요합니다. 폼의 수가 두개에 못 미친 경우는 적어도 두개가 될 때까지 폼을 생성합니다.

    9. 어느 폼을 응용 프로그램의 시작 폼으로 할지를 결정해 디자인 보기로 그 폼을 엽니다.

    10. 속성창의 [Event] 탭에서 ** onLoad** 이벤트 속성을 찾습니다. 속성 값의 우측에 있는 생략기호 ([...])의 버튼을 클릭하여 옵션의 목록에서 [Code Builder]를 선택하여  [OK] 를 클릭합니다. (속성창이 표시되지 않는 경우는 [Design] 탭에서  [Property Sheet] 를 클릭합니다. )

    11. Visual Basic Editor에서 Form_Load 프로시저를 다음과 같이 변경합니다.

      Private Sub Form_Load()
          CreateFormButtons
          Me.RibbonName = "FormNames"
      End Sub
      
    12. [Tools] 메뉴의 [References] 을 클릭합니다. [Microsoft Office 12.0 Object Library] (IRibbonControl 클래스를 사용하려면 이 개체에의 참조가 필요)를 선택해[OK] 를 클릭합니다.

    13. 데이터베이스를 저장하고  Visual Basic Editor 를 닫습니다.

    14. Microsoft Office 버튼을 클릭하고 [Access Options] 을 클릭합니다.

    15. [Current Database] 탭을 클릭합니다.

    16. [Application Options] 섹션에서  [Display Form] 박스 목록에서 시작 폼을 선택하고 [OK] 를 클릭합니다.

    17. 데이터베이스를 닫고, 다시 엽니다.

      사용자 지정 탭이 포함된 시작 폼이 열립니다. 사용자 지정 탭에는 응용 프로그램의 각 폼에 대응하는 버튼의 그룹이 표시 됩니다. 버튼의 한쪽을 클릭 하면, 같은 사용자 지정 UI 를 유지한 채로 대응하는 폼이 열립니다.

    리본 사용자 설정은 여기서 설명한 방법 외에 COM 추가기능을 사용하여 Access 에 추가할 수 있습니다. COM 추가기능에는 각 응용 프로그램에 VBA 코드를 추가하지 않고 , 사용자 지정 RibbonX 기능을 패키지로서 추가할 수 있다는 장점이 있습니다. 추가기능은 다른 Office 응용 프로그램과 같이 Access 로 구현됩니다.

    Note메모 :

    Access 의 COM 추가기능은 Visual Studio 2005 의 [Shared Add-In] 템플릿으로 생성할 수 있지만, Visual Studio 2005 Tools for Office Second Edition에서 생성할 수 없습니다. Access 는 Visual Studio 2005 Tools for Office Second Edition에서는 지원되지 않습니다.

    다른 응용 프로그램의 리본 사용자 설정 시나리오

    요구에 맞추어 Fluent UI 를 변경하는  방법을 보여주는 다음의 시나리오에 대해 생각해 보겠습니다.

    Note메모 :

    다음 시나리오에서는 이 문서의 「Office 응용 프로그램의 Fluent UI 사용자 지정」섹션에서  설명한 방법을 사용하여, 리본 사용자 설정의 동작을 보여줍니다.

    지금까지의 예에서는 기존 리본을 변경해 왔지만, UI 전체를 처음부터 생성할 수도 있습니다. 처음부터 생성하는 작업은 독자적인 UI 를 생성하여, 독자적인 리본 레이아웃을 디자인 해야 할 경우에 실행합니다. 리본 요소의 startFromScratch 특성을 True 로 설정하면, 모든 컨텐츠가 숨겨집니다 (따라서 모든 것을 보이지 않도록하는 작업을 수동으로 실시할 필요는 없습니다). startFromScratch 특성을 True 로 설정하면, 다음과 같은 변화가 발생합니다. 

    • [Add-Ins] 탭을 포함하여 기존 리본 탭 모든 것이 숨깁니다.

    • [New],[Open],[Save],[Application Options] 및 [Exit] 명령만이 표시되도록 Microsoft Office 메뉴가 변경됩니다.

      Caution note주의 :

      XML 마크 업 파일에서도 Microsoft Office 메뉴의 컨트롤을 표시하지 않도록 지정할 수 있습니다. 이 변경은 XML 마크 업에서 특정 컨트롤Visible 특성을 False로 설정하도록  명시적으로 요청해야 합니다. 이러한 명령을 숨기면, 응용 프로그램을 닫고 솔루션을 제거하는 방법 밖에 해결할 수 없는 회복 불가능한 상태에 응용 프로그램이 빠지는 경우도 있습니다.

    startFromScratch 특성을 설정해도 상태 막대는 변경되지 않고, 현상이 유지됩니다.

    다음의 XML 마크 업의 예에서는 startFromScratch 특성을 사용하여 Fluent UI 를 사용자 지정 합니다.

    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui" >
      <ribbon startFromScratch="true" >
        <tabs>
          <tab id="CustomTab" label="My Tab" >
            <group id="SimpleControls" label="My Group">
              <toggleButton id="ToggleButton1"
                size="large" label="Large Toggle Button"/>
              <button id="Button2" label="My Button " />
              <comboBox id="Combo1" label="ComboBox">
                <item id="Month1" label="January" />
                <item id="Month2" label="February" />
                <item id="Month3" label="March" />
              </comboBox>
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>
    

    이 예에서는 Fluent UI 의 모든 기본 구성요소를 보이지 않게 하고, 사용자 지정 탭, 1 개의 그룹 및 다양한 컨트롤을 대신 표시합니다. 

    탭을 표시하지 않음

    다음 예와 같이 마크 업을 사용하면, 기본 제공 탭 또는 사용자 지정 탭을 표시 또는 표시하지 않을 수 있습니다.

    <tab idMso="TabHome" visible="false" />
    

    프로그램에 의해서 탭 (또는 다른 요소)을 표시 또는 표시하지 않으려면, 콜백 프로시저를 지정합니다. 즉, 다음 XML 와 같이 요소를 정의합니다.

    <tab idMso="TabInsert" getVisible="getVisibleCallback" />
    

    그리고, 추가기능 또는 VBA 코드내에서 아이템을 보여주지 않을지 보여줄지 부울 값을 돌려주는 프로시저를 지정할 수 있습니다. 예를 들어, 다음 코드를 사용하면,  Word 2007 의 [Insert] 탭을 표시하지 않을 수 있습니다.

    Public
    Sub getVisibleCallback(control As IRibbonControl, _
        ByRef visible As Variant)
        Select Case DatePart("w", Date)
            Case vbSaturday, vbSunday
                visible = False
            Case Else
                visible = True
        End Select
    End Sub
    

    그룹을 표시 또는 표시하지 않음

    다음 예와 같이 코드를 (이전 예의 콜백 프로시저와 함께) 사용하면, 기본 제공 그룹 또는 사용자 지정 그룹을 표시 또는 표시하지 않을 수 있습니다.

    <tab idMso="TabView">
    <group idMso="GroupDocumentViews" visible="false" />
    <group id="MyCustomGroup" label="Custom Group"
        getVisible="getVisibleCallback" />
    </tab>
    

    사용자 지정 탭 추가

    다음 코드를 사용하면, 사용자 지정 탭을 추가할 수 있습니다.

    <tab id="CustomTab" label="My Tab" />
    

    컨트롤을 갖춘 사용자 지정 그룹 추가

    다음 코드를 사용하면, 사용자 지정 그룹을 추가하여 기본 제공 컨트롤을 추가할 수 있습니다.

    <group id="CustomGroup" label="My Group">
       <toggleButton idMso="Italic" />
       <toggleButton idMso="Bold" />
       <button idMso="FileSave" />
    </group>
    

    다음 코드를 사용하면, 사용자 지정 그룹을 추가하여 사용자 지정 컨트롤을 추가할 수 있습니다.

    <group id="CustomGroup" >
       <toggleButton id="MyToggleButton" size="large"
         label="Insert My Object"/>
       <checkBox id="AllowChanges" label="Allow Changes" />
       <dropDown id="ChooseDepartment" showLabel="true"
         label="Choose Department">
          <item id="Dept1" label="Shipping" />
          <item id="Dept2" label="Accounting" />
          <item id="Dept3" label="Engineering" />
       </dropDown>
    </group>
    

    중첩된 메뉴 및 컨트롤을 갖춘 사용자 지정 메뉴 생성

    다음 코드를 사용하면, 사용자 지정 그룹을 생성하여, 중첩된 기본 제공 메뉴와 컨트롤 및 사용자 지정 메뉴와 컨트롤을 추가할 수 있습니다. 이 마크 업에는 텍스트 있는 것과 텍스트 없는 것의 2 개의 메뉴 separator도 포함되어 있습니다.

    <menu id="MyMenu" label="Test Menu" itemSize="normal">
       <toggleButton idMso="Bold"/>
       <button id="MenuButton1" label="Button1" />
       <menuSeparator id="separator1"/>
       <toggleButton id="MenuToggleButton1" label="ToggleButton" />
       <button idMso="FileExit"/>
       <menu id="Nested1" label="Advanced" itemSize="normal">
          <button idMso="Cut"/>
          <button idMso="Copy"/>
          <button idMso="Paste"/>
          <menuSeparator id="separator2" title="Large Buttons Below"/>
            <menu id="Nested2" label="Large" itemSize="large">
            <button idMso="Cut"/>
             <button idMso="Copy"/>
            <button idMso="Paste"/>
          </menu>
       </menu>
    </menu>
    

    중첩된 아이템을 갖춘 콤보박스 또는 드롭 다운 박스 추가

    다음 코드를 사용하면, 아이템을 갖춘 기본 제공 콤보박스를 추가할 수 있습니다 (드롭 다운 컨트롤도 같은 구문을 사용합니다).

    <comboBox id="ComboBox1" label="ComboBox">
        <item id="item1" label="one" imageMso="_1" />
        <item id="item2" label="two" imageMso="_2" />
        <item id="item3" label="three" imageMso="_3" />
    </comboBox>
    

    아이템을 갖춘 사용자 지정 갤러리 컨트롤 추가

    다음 코드를 사용하면, 아이템을 갖춘 갤러리 컨트롤을 추가하여 사용자 지정 버튼 컨트롤을 추가할 수 있습니다.

    <gallery id="MonthGallery" imageMso="DateAndTimeInsert"
      label="Pick a Month:" columns="3" rows="4" onAction="InsertMonth" >
      <item id="Month1" label="January"/>
      <item id="Month2" label="February"/>
      <item id="Month3" label="March"/>
      <item id="Month4" label="April"/>
      <item id="Month5" label="May"/>
      <item id="Month6" label="June"/>
      <item id="Month7" label="July"/>
      <item id="Month8" label="August"/>
      <item id="Month9" label="September"/>
      <item id="Month10" label="October"/>
      <item id="Month11" label="November"/>
      <item id="Month12" label="December"/>
      <button id="InsertMonthButton"
        label="Insert current month" onAction="InsertCurrentMonth"/>
    </gallery>
    

    다음의 VBA 프로시저는 갤러리 아이템 및 갤러리내 버튼의 콜백 동작을 제공합니다.

    Sub InsertMonth(control As IRibbonControl, _
        selectedId As String, selectedIndex As Integer)
    
        Dim text As String
        Select Case control.ID
            Case "MonthGallery"
                text = monthName(selectedIndex + 1)
        End Select
        Selection.InsertAfter text
    End Sub
    
    Sub InsertCurrentMonth(control As IRibbonControl)
        Select Case control.ID
            Case "InsertMonthButton"
                text = monthName(DatePart("m", Date))
        End Select
        Selection.InsertAfter text
    End Sub
    
    Note메모 :

    갤러리를 정의할 때는 버튼 요소  이전에 모든 아이템 요소가 표시될 필요가 있습니다.

    갤러리 컨트롤 데이터는 실행시에 콜백을 사용하여 설정할 수 있습니다. getItemCount 콜백을 사용하면, 표시하는 아이템의 수를 결정할 수 있습니다. 또, getItemHeightgetItemWidth 콜백은 갤러리내의 아이템의 높이와 폭을 getItemImagegetItemLabel 콜백은 각 아이템의 이미지와 라벨을 getSelectedItemIDgetSelectedItemIndex 콜백은 선택된 ID 와 인덱스를 각각 취득할 때에 사용합니다.

    드롭 다운 목록 동적 입력

    실행시까지 리본 컨트롤에 어느 아이템을 표시할지를 모르는 경우가 있습니다. 콜백을 사용하면, 현재의 상황에 근거해 값을 지정할 수 있습니다. 예를 들어, 문서의 표제일람을 표시해야 하는 경우가 있습니다. 다음의 예에서는 어떻게 현재의 표제 목록을 제공할 수 있는지 보여줍니다. 

    다음의 컨트롤을 리본 사용자 설정에 삽입합니다.

    <dropDown id="HeadingsDropDown"
      getItemCount="GetItemCount"
      getItemID="GetItemID"
      getItemLabel="GetItemLabel"/>
    

    자신의 코드내에 (이 경우는 Word 문서의 Visual Basic Editor 내의 모듈로), 다음의 콜백 프로시저를 추가합니다.

    Sub GetItemCount(control As IRibbonControl, ByRef count)
        Dim varItems As Variant
        varItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
        count = UBound(varItems)
    End Sub
    
    Sub GetItemLabel(control As IRibbonControl, index As Integer, _
        ByRef label)
        Dim varItems As Variant
        varItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
        label = varItems(index + 1)
    End Sub
    
    Sub GetItemID(control As IRibbonControl, index As Integer, ByRef ID)
        ID = "heading" & index
    End Sub
    

    이것으로 드롭 다운 목록을 열었을 때에 문서내의 모든 표제가 표시됩니다.

    개별 컨트롤 그룹화

    기본적으로 그룹에 추가하는 컨트롤 위치는 리본에 의해서 결정할 수 있습니다. 보다 세세하게 컨트롤 레이아웃을 정의해야 하는 경우는 하나 또는 여러 박스를 사용하여 컨트롤을 그룹화 합니다. 박스를 생성할 경우에 그 박스의 방향 (세로 방향 또는 가로 방향)을 지정합니다. 그룹에는 여러 박스를 포함할 수 있습니다. 또, 박스간에는 세로 단락선을 삽입할 수 있습니다. (세로 방향 단락선은 separator 컨트롤을 사용하여 생성합니다. 이것은 세로 방향의 박스에게만 사용합니다. )

    다음의 예에서는 3 개의 그룹을 설정합니다. 하나는 가로 방향의 박스를 사용하고,  하나는 세로 방향의 박스를 사용하고, 하나는 박스를 사용하지 않습니다. 그림 4 는 이 예에 의해서 생성된 그룹을 보여줍니다.

    <group id="CustomGroup1" label="Horizontal Boxes"
       insertBeforeMso="GroupClipboard">
      <box id="box1" boxStyle="horizontal">
        <button id="buttonA1" label="Button1"/>
        <button id="buttonA2" label="Button2"/>
      </box>
      <box id="box2" boxStyle="horizontal">
        <button id="buttonAA" label="ButtonA"/>
        <button id="buttonAB" label="ButtonB"/>
        <button id="buttonAC" label="ButtonC"/>
      </box>
    </group>
    <group id="CustomGroup2" label="Vertical Boxes"
       insertBeforeMso="GroupClipboard">
      <box id="box3" boxStyle="vertical">
        <button id="buttonB1" label="Button1"/>
        <button id="buttonB2" label="Button2"/>
      </box>
      <separator id="separator2"/>
      <box id="box4" boxStyle="vertical">
        <button id="buttonBA" label="ButtonA"/>
        <button id="buttonBB" label="ButtonB"/>
        <button id="buttonBC" label="ButtonC"/>
      </box>
    </group>
    <group id="CustomGroup3" label="No Boxes"
       insertBeforeMso="GroupClipboard">
      <button id="buttonC1" label="Button1"/>
      <button id="buttonC2" label="Button2"/>
      <button id="buttonCA" label="ButtonA"/>
      <button id="buttonCB" label="ButtonB"/>
      <button id="buttonCC" label="ButtonC"/>
    </group>
    

    그림 4. 다양한 박스 스타일

    다른 박스 스타일

    COM 추가기능을 사용하여 Fluent UI 수정

    COM 추가기능을 사용하여 Fluent UI 를 변경할 수 있습니다. 리본 사용자 설정에 통합 COM 추가기능을 생성하여, 매니지 코드를 사용하는 방법은 두가지가 있습니다. 하나는 Visual Studio 2005 부속의 [Shared Add-In] 템플릿을 사용하여 표준의 공유 추가기능을 사용하는 방법, 다른 하나는 Visual Studio 2005 Tools for Office Second Edition을 사용하는 방법입니다. Visual Studio 2005 Tools for Office Second Edition을 설치 한 경우는 표준의 공유 추가기능보다 뛰어난 기능을 몇가지 갖춘 COM 추가기능을 생성할 수 있습니다.

    특히, Visual Studio 2005 Tools for Office Second Edition을 사용하여 생성한 추가기능에는 개별의 응용 프로그램 도메인(Application Domain)으로 실행되는 장점이 있습니다. 또, 프로그래밍모델이 공유 추가기능 템플릿으로 사용되는 것과 비교해서 간단하고,  보수하기 쉬운 점도 장점의 하나입니다. 자세한 내용은 「공유 추가기능을 Visual Studio Tools for Office 의 추가기능으로 이행한다」을 참조해 주세요.

    프로젝트로 공유 추가기능을 사용하여 Fluent UI 수정

    다음의 예에서는 매니지 COM 추가기능을 사용하여 사용자 지정 UI 를 Word 2007 에 추가합니다. 이 추가기능에 의해서 사용자 지정 탭, 그룹 및 버튼이 생성됩니다. 그리고, 버튼을 클릭 하면, 커서 위치에 회사명이 삽입됩니다.

    추가기능 솔루션 생성

    1. Visual Studio 2005 를 실행 합니다.

    2. [File] 메뉴의 [New] 에서 [Project] 를 클릭합니다.

    3. [New Project] 대화상자의 [Project Type] 윈도우에서 [Other Project Types] 를 배포하고 [Extensibility] 을 클릭하고,[Shared Add-In] 을 선택합니다.

    4. [Name] 박스에 「InsertCompanyAddIn」라고 입력하고 [OK] 를 클릭하여 프로젝트를 생성합니다.

    5. 공유 추가기능 마법사의 최초의 페이지에서 [Next] 을 클릭합니다.

    6. [Select a Programming Language] 페이지에서 [Visual C#] 또는 [Visual Basic] 를 클릭하고 [Next] 을 클릭합니다.

    7. [Select an Application Host] 페이지에서 [Microsoft Word] 이외의 선택을 모두 해제하고 [Next] 을 클릭합니다.

    8. [Enter a Name and Description] 페이지에서 이름으로서 「InsertCompanyAddIn」을 설명으로서 「Insert Company Name」을 입력하고 [Next] 을 클릭합니다.

    9. [Choose Add-in Options page 페이지에서 [I would like my Add-in to load when the host application loads] 을 선택하여 [Next] 을 클릭하고, [Finish] 를 클릭합니다.

    Visual Studio 에 추가기능 자체와 설치 프로젝트의 두개의 프로젝트가 포함된 새로운 솔루션이 생성됩니다 (설치 프로젝트를 사용하면, 추가기능을 다른 사용자의 컴퓨터에 설치 할 수 있습니다. 이것에 의해 디자인시에 추가기능을 설치 및 제거하기 쉬워집니다).

    Word 2007 및 리본 개체 모델로 조작하려면, 두가지 종류의 라이브러리 참조를 추가합니다.

    참조를 추가하려면

    1. 솔루션 탐색기에서 [References] 폴더를 확작합니다.

      [References] 폴더가 표시 되지 않은 경우는 [Project] 메뉴의 [ Show All Files] 를 클릭합니다.

    2. Microsoft.Office.Core 참조를 삭제합니다.

    3. [References] 폴더를 오른쪽 클릭하고 [References 추가] 를 클릭합니다.

    4. [COM] 탭을 클릭하고 [Microsoft Office 12.0 Object Library] 를 선택하고, [OK] 를 클릭합니다.

    5. 열려진 코드 파일의 상부에서 다음의 구문을 추가합니다.

      Imports Microsoft.Office.Core
      Imports Word = Microsoft.Office.Interop.Word
      
      using Microsoft.Office.Core;
      using Word = Microsoft.Office.Interop.Word;
      

    XML 사용자 지정 파일 생성

    1. [Project] 메뉴의 [Add New Item] 를 클릭합니다.

    2. [Add New Item] 대화상자로 [XML File] 을 선택합니다. 새로운 파일에 Ribbon.xml 라는 이름을 붙이고, [Add] 를 클릭합니다.

    3. 새로운 XML 파일에서 다음의 XML 마크 업을 추가합니다.

      <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
        <ribbon>
          <tabs>
            <tab id="CustomTab" label="My Tab">
              <group id="SampleGroup" label="Sample Group">
                <button id="Button" label="Insert Company Name"
                  size="large" onAction="InsertCompanyName" />
              </group>
            </tab>
          </tabs>
        </ribbon>
      </customUI>
      
    4. 파일을 저장하고 닫습니다.

    프로젝트의 리소스 파일 안에서 XML 파일이 리소스인 경우, 이 XML 파일을 사용하는 것이 가장 간단합니다.

    XML 리소스 생성

    1. 솔루션 탐색기에서 [Ribbon.xml] 를 선택합니다.

    2. 속성창에서 "빌드 동작" 속성을 선택하여  옵션의 목록에서 [임베디드 리소스]를 선택합니다.

    3. [Project] 메뉴의 [InsertCompanyAddIn 속성] 을 클릭합니다.

    4. [Resources] 탭을 클릭합니다.

    5. 솔루션 탐색기에서 Ribbon.xml 를 리소스의 디자인 화면에 드래그 합니다.

      이것에 의해 XML 컨텐츠가 포함된 새로운 파일 기반의 리소스가 생성됩니다. 향후, Ribbon.xml 파일은 응용 프로그램 리소스로서 자동적으로 저장 되어 그 컨텐츠는 Visual Basic 또는 Visual C# 언어의 기능을 사용하여 얻을 수 있습니다.

    6. 리소스 윈도우를 닫습니다. 프롬프트가 표시되면, [Yes] 를 클릭하여 리소스를 저장합니다.

    호스트 응용 프로그램에 액세스하여 리본을 조작하려면

    1. 솔루션 탐색기에서 [Connect.cs] 또는 [Connect.vb] 를 오른쪽 클릭하고 [View Code] 를 클릭합니다.

    2. applicationObject 변수의 기존 선언을 찾아내고, Word.Application 개체를 참조하도록 변경합니다. 즉, 선언을 다음 코드와 같이 변경합니다.

      Private applicationObject As Word.Application
      
      private Word.Application applicationObject;
      
    3. OnConnection 메서드의 첫 행을 변경하여, Word.Application 개체의 인스턴스를 생성합니다.

      applicationObject = DirectCast(application, Word.Application)
      
      applicationObject =(Word.Application)application;
      
    4. (Visual Basic only) 클래스의 선두에 있는 Implements 가 시작되는 코드행을 변경하여, IRibbonExtensibility 네임 스페이스 구현 지원을 추가합니다. Visual Basic 에 의해 자동적으로 GetCustomUI 프로시저가 삽입됩니다.

      Implements Extensibility.IDTExtensibility2, IRibbonExtensibility
      
    5. (C# only) public class Connect : 구문의 마지막에 쉼표를 추가하고, 다음의 인터페이스 이름을 입력합니다.

      IRibbonExtensibility
      
    6. (C# only) 추가한 인터페이스를 오른쪽 클릭하고 [Implement Interface] 을 클릭합니다. 그리고 [Implement Interface Explicitly] 을 클릭합니다. 이것에 의해 스텁이 IRibbonExtensibility 인터페이스 멤버 GetCustomUI에 대해서만 추가됩니다.

    7. GetCustomUI 메서드를 다음 코드와 같이 변경합니다.

      Public Function GetCustomUI(ByVal RibbonID AsString) As String _
        Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI
        Return My.Resources.Ribbon
      End Function
      
      string IRibbonExtensibility.GetCustomUI(string RibbonID)
      {
        Return Properties.Resources.Ribbon;
      }
      
      Caution note주의 :

      GetCustomUI 는 리본 사용자 설정의 XML 문자열을 반환하도록 구현해야 하기 때문에, 초기화로 해서는 안됩니다. 특히, GetCustomUI 구현에서는 대화상자나 메시지창을 표시하지 마세요. 초기화는 OnConnection 메서드 (공유 추가기능의 경우) 또는 ThisAddIn_Startup 메서드 (Visual Studio 2005 Tools for Office Second Edition에서 생성된 추가기능의 경우)로 실시하는 것을 권장합니다.

    8. 클래스에 다음의 메서드를 추가합니다. 이 메서드에 의해 회사명이 문서내의 현재 커서 위치에 삽입됩니다.

      Public Sub InsertCompanyName(ByVal control As Office.IRibbonControl)
          ' Inserts the specified text at the current location
          ' in the document.
          Dim companyName As String = "Microsoft Corporation"
          applicationObject.Selection.InsertAfter(companyName)
      End Sub
      
      public void InsertCompanyName(Office.IRibbonControl control)
      {
        // Inserts the specified text at the current location 
        // in the document.
        string companyName = "Microsoft Corporation";
        applicationObject.Selection.InsertAfter(companyName);
      }
      
    9. [File] 메뉴의 [Save All] 을 클릭합니다.

    10. Word 2007 이 실행 된 경우는 종료합니다.

    11. [Build] 메뉴의 [Build Solution] 를 클릭합니다.

    12. 솔루션 탐색기에서 [InsertCompanyAddInSetup] 를 오른쪽 클릭하고 [Build] 를 클릭합니다.

    13. [InsertCompanyAddInSetup] 를 오른쪽 클릭하고 [Install] 를 클릭합니다.

      InsertCompanyAddIn 설치 마법사가 표시됩니다.

    14. 각 페이지에서 [Next]을 클릭하여 마지막의 화면에서 [Close] 을 클릭합니다.

    15. Word 를 실행 합니다.

      [My Tab] 탭이 다른 탭의 우측으로 표시됩니다.

    16. [My Tab] 를 클릭하고 [Insert Company Name] 을 클릭합니다. 지정한 회사명이 문서내의 커서 위치에 삽입됩니다.

    17. Word 를 종료합니다.

    18. Visual Studio 의 솔루션 탐색기에서 [InsertCompanyAddInSetup] 를 오른쪽 클릭하고 [Uninstall] 를 클릭합니다.

    Visual Studio 2005 Tools for Office Second Edition Project 를 사용하여 Fluent UI 수정

    여기에서는 Visual Studio Tools 2005 Tools for Office Second Edition을 사용하여 이전 예와 같은 추가기능을 생성하는 방법을 소개합니다.

    프로젝트를 생성하려면

    1. Visual Studio 2005 Tools for Office Second Edition을 실행 합니다.

    2. [File] 메뉴의 [New] 에서 [Project] 를 클릭합니다.

    3. [New Project] 대화상자에서 [Visual Basic] 또는 [Visual C#] 를 선택합니다.

    4. [Project Type] 윈도우에서 [Office] 노드를 배포하고 [2007 Add-ins] 을 선택합니다.

    5. [Templates] 윈도우에서 [Word Add-in] 을 선택합니다.

    6. 새로운 추가기능 InsertCompanyAddIn1 에 이름을 붙이고, [OK] 를 클릭하여 새로운 추가기능을 생성합니다.

    Visual Studio 에 추가기능 자체와 설치 프로젝트의 두 개의 프로젝트가 포함된 새로운 솔루션이 생성됩니다. (설치 프로젝트를 사용하면, 추가기능을 다른 사용자의 컴퓨터에 설치 할 수 있습니다. 이것에 의해 디자인시에 추가기능을 설치 및 제거하기 쉬워집니다. )

    새로운 추가기능에는 IExtensibility2 인터페이스가 구현되었지만, 이 인터페이스에 필요한 모든 프로시저가 표시되고 있는 것은 아닙니다. Visual Studio 2005 Tools for Office Second Edition에서는 ThisAddIn 라는 이름의 간단클래스가 생성되어 필요한 프로시저가 제공됩니다. 또, 코드를 ThisAddIn_Startup 메서드 또는 ThisAddin_Shutdown 메서드에 추가할 수 있습니다. 이 예에서는 어느 메서드에도 코드가 필요 없습니다. 또, 추가기능을 생성하기 위해서 코드를 변경하거나 참조를 설정할 필요도 없습니다. 즉, 모든 관련 동작이 수행됩니다.

    리본의 확장 아이템을 추가하려면

    1. [Project] 메뉴의 [Add New Item] 를 클릭합니다.

    2. [Add New Item] 대화상자에서 [Ribbon Support] 을 선택합니다.

    3. [Add] 를 클릭하여 기본값의 이름 (Ribbon1.vb 또는 Ribbon1.cs)을 그대로 사용합니다.

      Ribbon1.xml 이라는 이름의 XML 파일과 새로운 클래스가 프로젝트에 추가됩니다. XML 파일에는 매우 간단사용자 지정 UI 가 포함됩니다. 새로운 Ribbon1 파일에는 주석처리된 ThisAddIn  확장과 Ribbon1 라는 이름의 새로운 클래스가 포함되어 있습니다.

    4. 솔루션 탐색기에서 [Ribbon1.xml] 를 더블 클릭하여 XML 편집기로 열립니다.

    5. 기존 XML 를 다음과 같이 변경합니다.

      <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui"
                onLoad="onLoad">
        <ribbon>
          <tabs>
            <tab id="CustomTab" label="My Tools Tab">
              <group id="SampleGroup" label="Sample Group">
                <button id="Button" label="Insert Company Name"
                  size="large" onAction="InsertCompanyName" />
              </group>
            </tab>
          </tabs>
        </ribbon>
      </customUI>
      
    6. XML 파일을 저장하고, XML 편집기를 종료합니다.

    프로젝트의 리소스 파일 안에서 XML 파일이 리소스로서 다뤄지는 경우, 이 XML 파일을 사용하는 것이 가장 간단합니다.

    XML 리소스 생성

    1. [Project] 메뉴의 [InsertCompanyAddIn1 속성] 을 클릭합니다.

    2. [Resources] 탭을 클릭합니다.

    3. 솔루션 탐색기에서 Ribbon1.xml 를 리소스의 디자인 화면에 드래그 합니다.

      이것에 의해 XML 컨텐츠가 포함된 새로운 파일 기반의 리소스가 생성됩니다. 향후, Ribbon1.xml 파일은 응용 프로그램 리소스로서 자동적으로 저장 되어 그 컨텐츠는 Visual Basic 또는 Visual C# 언어의 기능을 사용하여 얻을 수 있습니다.

    4. 리소스 윈도우를 닫습니다. 프롬프트가 표시되면, [Yes] 를 클릭하여 리소스를 저장합니다.

    리본 코드를 변경하여, 추가기능 완료

    1. 솔루션 탐색기에서 [Ribbon1.vb] 또는 [Ribbon1.cs] 를 오른쪽 클릭하고 [View Code] 를 클릭합니다.

    2. 코드 편집기에서 ThisAddIn 라는 이름의 partial 클래스를 선택하여  partial 클래스의 주석을 해제합니다.

      RequestService 프로시저를 사용하면, Visual Studio 2005 Tools for Office Second Edition 런타임으로 추가기능의 리본 사용자 설정에 대한 콜백을 처리하는 클래스를 결정할 수 있습니다. 이 프로시저가 IRibbonExtensibility 인터페이스에 대응하는 GUID 를 받으면, 그IRibbonUI 인스턴스를 돌려줍니다 (존재하는 경우).존재하지 않는 경우는 컨트롤을 기본클래스의 RequestService 메서드에 건네줍니다.

      Note메모 :

      기본적으로 RequestService 메서드는 주석에 표시됩니다. 이 메서드의 오버라이드(override)가 이미 추가기능에 포함되어 있을 가능성이 있기 때문입니다 (FormRegionStartup 인터페이스 또는 새로운 다른 확장 인터페이스의 1에 대해).이 경우는 주석처리된 코드에서부터 if 블럭의 오버라이드(override)한 부분을 복사합니다.

    3. GetResourceText 를 호출하지 않고 Ribbon1 리소스에서 XML 를 반환하도록 Ribbon1 클래스에서 GetCustomUI 프로시저를 변경합니다.

      Return My.Resources.Ribbon1
      
      return Properties.Resources.Ribbon1;
      
      Note메모 :

      추가기능 템플릿에는 Helpers 비표시영역 안에 XML 파일의 컨텐츠를 취득한 GetResourceText 라는 이름의 프로시저가 포함되어 있습니다. 필요한 업무는 이 프로시저에 의해서 행해지지만, 리소스 이름을 문자열로서 지정 해야 합니다. 이 방법은 조금 불안정합니다.  (리소스 이름을 변경하면, 코드를 컴파일하는 것은 가능하지만, 실행시에 추가기능이 실패합니다).따라서 다음과 같이, XML 컨텐츠를 리소스 파일에 추가하여 리소스 취득에 대한 언어 고유의 지원을 사용하는 것을 권장합니다. GetResourceText 프로시저에 의해서 템플릿은 "곧바로" 동작할 수 있습니다. 즉, 추가기능을 생성 및 빌드하면, 어떤 변경도 하지 않고 리본 사용자 설정이 동작합니다.

    4. Ribbon1 클래스에서 Word 의Application 개체를 참조할 수 있는 변수의 퍼블릭 선언을 추가합니다.

      Public Application As Word.Application
      
      public Word.Application Application;
      
    5. 같은 파일 안의 ThisAddIn partial 클래스에서 Ribbon1 클래스 인스턴스를 생성하는 코드행의 바로 아래에 Ribbon1 클래스의 Application 속성을 설정하는 코드를 추가합니다.

      ' In the RequestService method:
      ribbon.Application = Application
      
      // In the RequestService method:
      ribbon.Application = Application;
      
    6. 다음의 프로시저를 Ribbon1 클래스에 추가합니다. 리본내의 새로운 버튼의 onAction 콜백을 처리하고  문서내의 커서위치에 회사명을 삽입할 수 있습니다.

      Public Sub InsertCompanyName(ByVal control As IRibbonControl)
        ' Inserts the specified text at the current location
        ' in the document.
        Dim companyName As String = "Microsoft Corporation"
        Application.Selection.InsertAfter(companyName)
      End Sub
      
      public void InsertCompanyName(IRibbonControl control)
      {
        // Inserts the specified text at the current location 
        // in the document.
        string companyName = "Microsoft Corporation";
        Application.Selection.InsertAfter(companyName);
      }
      

    추가기능 테스트

    1. [File] 메뉴의 [Save All] 을 클릭합니다.

    2. F5 키를 눌러 프로젝트를 실행합니다. 이 조작에 의해 Word 2007 도 함께 실행합니다.

    3. [My Tools Tab] 탭을 클릭하고 [Large Button] 을 클릭합니다.

      회사명이 문서의 커서 위치에 삽입됩니다.

    4. Word 2007 을 종료합니다.

    앞의 예와 같이, 설치 프로젝트를 빌드하여 추가기능을 설치 할 수 있습니다. 여기에서는 Visual Studio 2005 Tools for Office Second Edition 에 의해서 추가기능을 실행 ( 및 디버그)하기 쉬워졌습니다. F5 키를 누르면, 프로젝트는 예상대로 실행됩니다. 공유 추가기능 템플릿에서 똑같이 동작시키는 것도 가능합니다.  F5 를 눌렀을 때에 어느 응용 프로그램을 실행할지 보여주도록 프로젝트 속성을 설정하여, 적절한 Office 응용 프로그램을 선택합니다. 추가기능을 디버그하여, breakpoint를 코드에 추가해면 좋습니다. 

    기존 명령 모음 추가기능 작업

    COM 추가기능을 생성하는 경우, 일반적으로는 사용자가 추가기능을 조작할 수 있어야 합니다. 이전 버전의 Office에서는 명령 모음 개체 모델을 사용하여 메뉴 항목 또는 도구 모음 버튼을 추가하여 이것을 구현했습니다. Office 2007에서도 사용자 지정 응용 프로그램은 Fluent UI에서 계속해 동작합니다. 또, 대부분의 경우, 변경이 불필요합니다. 다만, 명령 모음 개체 모델 또는 메뉴나 도구 모음을 변경하는 다른 기술 (WordBasic 나 XLM 등)을 사용해서 진행한 변경은 개별의 [Add-Ins] 탭에 표시됩니다. 이것은 사용자가 전에 사용한 추가기능을 조작하는데 필요한 컨트롤을 찾을 때에 도움이 됩니다.

    그림 5. Excel 2007 의 [Add-Ins] 탭에 추가된 사용자 지정 도구 모음 버튼

    Excel 2007 의 [추가기능] 탭

    Fluent UI 의 아이템의 변경에는 이미 설명한 방법 및 코드를 사용할 수 있습니다. 메뉴 구조를 변경하는 기존 추가기능에 대해는 명령이 [Add-Ins] 탭에 표시됩니다. 기존 추가기능의 업데이트 방법의 자세한 내용은 기술 문서 「공유 추가기능을 Visual Studio Tools for Office 의 추가기능으로 이행한다」을 참조해 주세요.

    동적 Fluent UI 업데이트

    컨트롤 속성을 돌려주는 콜백 (갤러리 컨트롤 getItemCount 콜백 등)은 컨트롤 재초기화가 명시적으로 지정되었을 경우를 제외하고 일반적으로는  Fluent UI 가 초기화되었을 때만 호출됩니다. 이것은 리본에의 참조를 코드에 저장 해 개별의 컨트롤 또는 리본 전체를 무효로 하는 리본 메서드 호출을 통해 강제적으로 실행 가능합니다.  <customUI> 요소로 콜백 프로시저를 지정하고, onLoad 특성을 추가해야 합니다. onLoad 콜백은 RibbonX 마크 업 파일이 정상적으로 읽혔을 때에 한 번 밖에 호출되지 않습니다. 콜백 프로시저는 IRibbonUI 개체를 매개 변수로서 받습니다. 코드는 다음에 사용할 수 있도록 이 참조를 캐시 할 수 있습니다. IRibbonUI 클래스에는 리본 전체, 혹은 한개의 컨트롤을 무효로 할 수 있는 메서드가 있습니다.

    실행시에 컨트롤을 업데이트 할 수 있도록 IRibbonUI 개체를 캐시 하려면, 다음과 같은 코드를 추가합니다.

    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui"
      onLoad="ribbonLoaded">
    

    코드내 (문서내의 VBA 코드 또는 추가기능 안의 Visual Basic 코드 또는 C# 코드)에서는 다음과 같이 프로시저를 추가합니다.

    IRibbonUI myRibbon;
    
    public void ribbonLoaded(IRibbonUI ribbon)
    {
      myRibbon = ribbon;
    }
    

    IRibbonUI 인터페이스가 다음의 메서드를 공개합니다.

    표 4. IRibbonUI 의 메서드의 인터페이스

    메서드 동작 설명

    Invalidate()

    콜백

    모든 사용자 지정 컨트롤이 다시 초기화되도록 합니다.

    InvalidateControl(string controlID)

    콜백

    특정 컨트롤이 다시 초기화되도록 합니다.

    이미지 로드

    <customUI> 요소의 loadImage 특성을 사용하면, 모든 이미지를 로드할 수 있는 콜백을 지정할 수 있습니다. 이 콜백 프로시저를 설정하면, Office 가 그 콜백 프로시저를 호출하여 이미지를 로드하는 각 컨트롤 이미지 특성의 문자열을 건네줍니다. getImage 콜백을 수차례, 예를 들어, 이미지를 필요로하는 컨트롤 마다 구현 할 필요는 없습니다. 예를 들어, 사용자 지정에는 다음과 같은 마크 업이 포함된 경우가 있습니다.

    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui"
      loadImage="GetImage">
    <!-- Later in the markup -->
    <button id="myButton" image="mypic.jpg" />
    

    버튼 이미지를 제공하기 위해서 GetImage 함수가 호출됩니다. 이것은 매개 변수mypic.jpg  를 건네주어,  IPictureDisp 개체를 요청합니다. 이 방법을 사용하면, 사용자 지정에 필요한 모든 이미지를 돌려주는 콜백 프로시저를 기술할 수 있습니다. 각 컨트롤 getImage 콜백을 개별적으로 기술할 필요는 없습니다. 리본의 Invalidate 메서드 또는 InvalidateControl 메서드를 호출할 때, loadImage 콜백이 다시 호출되지 않습니다. 실행시에 이미지를 동적으로 변경해야 하는 컨트롤은 getImage 콜백을 사용합니다.

    예를 들어, 사용자 지정의 이미지를 제공하려면 다음 코드를 사용할 수 있습니다. getImage 콜백은 stdole.IPictureDisp 유형을 돌려주지 않으면 안됩니다. 따라서 일반적으로는  이미지를 이 유형으로 변환해야 합니다. 이 변환을 실행하려면, 다음 PictureConverter 클래스를 사용합니다. 이 클래스는 AxHost 클래스에서 상속됩니다.

    Friend Class PictureConverter
      Inherits AxHost
    
      Private Sub New()
        MyBase.New(String.Empty)
      End Sub
      
      Public Shared Function ImageToPictureDisp( _
        ByVal image As Image) As stdole.IPictureDisp
        Return CType(GetIPictureDispFromPicture(image), _
          stdole.IPictureDisp)
      End Function
      
      Public  Shared Function IconToPictureDisp( _
        ByVal icon As Icon) As stdole.IPictureDisp
        Return ImageToPictureDisp(icon.ToBitmap())
      End Function
      
      Public Shared Function PictureDispToImage( _
        ByVal picture As stdole.IPictureDisp) As Image
        Return GetPictureFromIPicture(picture)
      End Function
    End Class
    
    internal class PictureConverter : AxHost
    {
      private PictureConverter() : base(String.Empty) { }
    
      static public stdole.IPictureDisp ImageToPictureDisp(Image image)
      {
        return (stdole.IPictureDisp)GetIPictureDispFromPicture(image);
      }
    
      static public stdole.IPictureDisp IconToPictureDisp(Icon icon)
      {
        return ImageToPictureDisp(icon.ToBitmap());
      }
    
      static public Image PictureDispToImage(stdole.IPictureDisp picture)
      {
        return GetPictureFromIPicture(picture);
      }
    }
    

    그러면, 콜백 프로시저는 다음과 같은 모습을 보일 것이며, 이것은 MyIcon 라는 프로젝트 리소스에 아이콘을 추가한 것을 가정했을 때이다.

    Public Function GetImage( _
      ByVal imageName As String) As stdole.IPictureDisp
      Return PictureConverter.IconToPictureDisp(My.Resources.MyIcon)
    End Function
    
    public stdole.IPictureDisp GetImage(string imageName)
    {
      return
        PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
    }
    
    Note메모 :

    이 코드를 실행하려면, 프로젝트에 stdole 어셈블리 참조 집합이 필요합니다. 이 참조는 Visual Studio 2005 Tools for Office Second Edition을 사용하여 생성된 프로젝트에 자동적으로 포함할 수 있습니다.

    요약

    이전 버전의 Office에서는 UI 를 사용자 지정하는 것은 추가기능을 공유하는 응용 프로그램 마다 COM 추가기능 또는 DLL 파일을 생성하는 것을 의미했습니다. 반면에 리본 기능에서는 리본의 생성 및 사용자 지정을 간소화하는 텍스트 기반의 선언 XML 마크 업을 사용합니다. XML 몇 줄에 의해서 사용자에 적절한 인터페이스를 생성할 수 있습니다. 또, 1 개의 파일에 XML 마크 업이 포함되어 있기 때문에 요구의 변경에 대응하는 인터페이스 변경이 아주 쉽게 됩니다. 알기 쉬운 장소에 명령을 배포하는 것으로 사용자의 생산성도 향상됩니다. 또한 리본에 의해서 응용 프로그램 사이에서의 일관성이 구현되고, 각 응용 프로그램 학습에 필요한 시간이 줄어듭니다.