다음을 통해 공유


연습: 런타임에 응용 프로그램 수준 추가 기능의 문서에 컨트롤 추가

응용 프로그램 수준 추가 기능을 사용하여 열려 있는 Microsoft Office Word 문서에 컨트롤을 추가할 수 있습니다. 이 연습에서는 리본 메뉴를 사용하여 사용자가 문서에 Button 또는 RichTextContentControl을 추가할 수 있게 하는 방법을 보여 줍니다.

적용 대상: 이 항목의 정보는 Word 2007 및 Word 2010의 응용 프로그램 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 응용 프로그램 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하십시오.

이 연습에서는 다음 작업을 수행합니다.

  • 새 Word 추가 기능 프로젝트 만들기

  • 문서에 컨트롤을 추가하기 위한 UI(사용자 인터페이스) 제공

  • 런타임에 문서에 컨트롤 추가

  • 문서에서 컨트롤 제거

참고

다음 지침처럼 컴퓨터에서 Visual Studio 사용자 인터페이스 요소 일부에 대한 이름이나 위치를 다르게 표시할 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

사전 요구 사항

이 연습을 완료하려면 다음 구성 요소가 필요합니다.

-

Microsoft Office 개발자 도구를 포함하는 Visual Studio 2010 버전입니다. 자세한 내용은 [Office 솔루션을 개발할 수 있도록 컴퓨터 구성](bb398242\(v=vs.100\).md)을 참조하십시오.
  • Word 2007 또는 Word 2010

새 Word 추가 기능 프로젝트 만들기

우선 Word 추가 기능 프로젝트를 만들어야 합니다.

새 Word 추가 기능 프로젝트를 만들려면

  1. 이름이 WordDynamicControls인 Word용 응용 프로그램 수준 추가 기능 프로젝트를 만듭니다. 자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기를 참조하십시오.

  2. 프로젝트가 .NET Framework 4를 대상으로 하는 경우 Microsoft.Office.Tools.Word.v4.0.Utilities.dll 어셈블리에 대한 참조를 추가합니다. 이 참조는 이 연습의 뒷부분에서 문서에 Windows Forms 컨트롤을 프로그래밍 방식으로 추가하는 데 필요합니다.

문서에 컨트롤을 추가하기 위한 UI 제공

Word의 리본 메뉴에 사용자 지정 탭을 추가합니다. 사용자는 탭의 확인란을 선택하여 문서에 컨트롤을 추가할 수 있습니다.

문서에 컨트롤을 추가하기 위한 UI를 제공하려면

  1. 프로젝트 메뉴에서 새 항목 추가를 클릭합니다.

  2. 새 항목 추가 대화 상자에서 **리본(비주얼 디자이너)**을 선택합니다.

  3. 새 리본 메뉴의 이름을 MyRibbon으로 변경하고 추가를 클릭합니다.

    MyRibbon.cs 또는 MyRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.

  4. 리본 디자이너에서 group1 그룹을 클릭합니다.

  5. 속성 창에서 group1Label 속성을 "Add Controls"로 변경합니다.

  6. 도구 상자Office 리본 컨트롤 탭에 있는 CheckBox 컨트롤을 group1로 끌어 옵니다.

  7. CheckBox1을 클릭하여 선택합니다.

  8. 속성 창에서 다음과 같이 속성을 변경합니다.

    Property

    Name

    addButtonCheckBox

    레이블

    추가 단추

  9. group1에 두 번째 확인란을 추가하고 다음 속성을 변경합니다.

    Property

    Name

    addRichTextCheckBox

    레이블

    Add Rich Text Control

  10. 리본 디자이너에서 Add Button을 두 번 클릭합니다.

    Add Button 확인란의 Click 이벤트 처리기가 코드 편집기에서 열립니다.

  11. 리본 디자이너로 돌아가서 Add Rich Text Control을 두 번 클릭합니다.

    Add Rich Text Control 확인란의 Click 이벤트 처리기가 코드 편집기에서 열립니다.

이 연습의 뒷부분에서는 활성 문서의 컨트롤을 추가 및 제거하는 코드를 이러한 이벤트 처리기에 추가합니다.

활성 문서의 컨트롤 추가 및 제거

컨트롤을 추가하려면 먼저 추가 기능 코드에서 활성 문서를 Microsoft.Office.Tools.Word.Document 호스트 항목으로 변환해야 합니다. Visual Studio Tools for Office 솔루션에서는 관리되는 컨트롤을 호스트 항목에만 추가할 수 있으며 이러한 호스트 항목은 컨트롤의 컨테이너로 사용됩니다. 응용 프로그램 수준 추가 기능 프로젝트에서는 GetVstoObject 메서드를 사용하여 런타임에 호스트 항목을 만들 수 있습니다.

활성 문서에서 Button 또는 RichTextContentControl을 추가하거나 제거하기 위해 호출할 수 있는 메서드를 ThisAddIn 클래스에 추가합니다. 이 연습의 뒷부분에서는 리본 메뉴에 있는 확인란의 Click 이벤트 처리기에서 이러한 메서드를 호출합니다.

활성 문서의 컨트롤을 추가 및 제거하려면

  1. 솔루션 탐색기에서 ThisAddIn.cs 또는 ThisAddIn.vb를 두 번 클릭하여 코드 편집기에서 해당 파일을 엽니다.

  2. ThisAddIn 클래스에 다음 코드를 추가합니다. 이 코드는 문서에 추가할 컨트롤을 나타내는 ButtonRichTextContentControl 개체를 선언합니다.

    Private button As Microsoft.Office.Tools.Word.Controls.Button = Nothing
    Private richTextControl As RichTextContentControl = Nothing
    
    private Microsoft.Office.Tools.Word.Controls.Button button = null;
    private RichTextContentControl richTextControl = null;
    
  3. ThisAddIn 클래스에 다음 메서드를 추가합니다. 사용자가 리본 메뉴에서 Add Button 확인란을 클릭하면 이 메서드는 해당 확인란이 선택된 경우 문서의 현재 선택 영역에 Button을 추가하고, 해당 확인란의 선택이 취소된 경우 Button을 제거합니다.

    Friend Sub ToggleButtonOnDocument()
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Me.Application.ActiveDocument)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim vstoDocument As Document = Me.Application.ActiveDocument.GetVstoObject()
    
        Dim name As String = "MyButton"
    
        If Globals.Ribbons.MyRibbon.addButtonCheckBox.Checked Then
            Dim selection = Me.Application.Selection
            If selection IsNot Nothing AndAlso selection.Range IsNot Nothing Then
                button = vstoDocument.Controls.AddButton( _
                    selection.Range, 100, 30, name)
            End If
        Else
            vstoDocument.Controls.Remove(name)
        End If
    End Sub
    
    internal void ToggleButtonOnDocument()
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Document vstoDocument = this.Application.ActiveDocument.GetVstoObject();
    
        string name = "MyButton";
    
        if (Globals.Ribbons.MyRibbon.addButtonCheckBox.Checked)
        {
            Word.Selection selection = this.Application.Selection;
            if (selection != null && selection.Range != null)
            {
                button = vstoDocument.Controls.AddButton(
                    selection.Range, 100, 30, name);
            }
        }
        else
        {
            vstoDocument.Controls.Remove(name);
        }
    }
    
  4. ThisAddIn 클래스에 다음 메서드를 추가합니다. 사용자가 리본 메뉴에서 Add Rich Text Control 확인란을 클릭하면 이 메서드는 해당 확인란이 선택된 경우 문서의 현재 선택 영역에 RichTextContentControl을 추가하고, 해당 확인란의 선택이 취소된 경우 RichTextContentControl을 제거합니다.

    Friend Sub ToggleRichTextControlOnDocument()
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Me.Application.ActiveDocument)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim vstoDocument As Document = Me.Application.ActiveDocument.GetVstoObject()
    
        Dim name As String = "MyRichTextBoxControl"
    
        If Globals.Ribbons.MyRibbon.addRichTextCheckBox.Checked Then
            Dim selection = Me.Application.Selection
            If selection IsNot Nothing AndAlso selection.Range IsNot Nothing Then
                richTextControl = vstoDocument.Controls.AddRichTextContentControl( _
                        selection.Range, name)
            End If
        Else
            vstoDocument.Controls.Remove(name)
        End If
    End Sub
    
    internal void ToggleRichTextControlOnDocument()
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Document vstoDocument = this.Application.ActiveDocument.GetVstoObject();
    
        string name = "MyRichTextBoxControl";
    
        if (Globals.Ribbons.MyRibbon.addRichTextCheckBox.Checked)
        {
            Word.Selection selection = this.Application.Selection;
            if (selection != null && selection.Range != null)
            {
                richTextControl = vstoDocument.Controls.AddRichTextContentControl(
                    selection.Range, name);
            }
        }
        else
        {
            vstoDocument.Controls.Remove(name);
        }
    }
    

문서가 저장될 때 Button 컨트롤 제거

Windows Forms 컨트롤은 문서가 저장되고 닫힐 때 유지되지 않습니다. 하지만 각 컨트롤에 대한 ActiveX 래퍼는 문서에 남아 있으며 최종 사용자가 문서를 다시 열면 이 래퍼의 테두리가 표시됩니다. 추가 기능에서 동적으로 만들어진 Windows Forms 컨트롤을 정리하는 방법에는 몇 가지가 있습니다. 이 연습에서는 문서가 저장될 때 Button 컨트롤을 프로그래밍 방식으로 제거합니다.

문서가 저장될 때 Button 컨트롤을 제거하려면

  1. ThisAddIn.cs 또는 ThisAddIn.vb 코드 파일에서 ThisAddIn 클래스에 다음 메서드를 추가합니다. 이 메서드는 DocumentBeforeSave 이벤트에 대한 이벤트 처리기입니다. 저장된 문서에 이 이벤트 처리기와 연결된 Document 호스트 항목이 있으면 해당 이벤트 처리기가 호스트 항목을 가져오고 Button 컨트롤을 제거합니다.

    Private Sub Application_DocumentBeforeSave(ByVal Doc As Word.Document, _
        ByRef SaveAsUI As Boolean, ByRef Cancel As Boolean) Handles Application.DocumentBeforeSave
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim isExtended As Boolean = Globals.Factory.HasVstoObject(Doc)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim isExtended As Boolean = Doc.HasVstoObject()
    
        If isExtended Then
            ' Use the following line of code in projects that target the .NET Framework 4.
            Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Doc)
    
            ' In projects that target the .NET Framework 3.5, use the following line of code.
            ' Dim vstoDocument As Document = Doc.GetVstoObject()
    
            If vstoDocument.Controls.Contains(button) Then
                vstoDocument.Controls.Remove(button)
                Globals.Ribbons.MyRibbon.addButtonCheckBox.Checked = False
            End If
        End If
    End Sub
    
    private void Application_DocumentBeforeSave(Word.Document Doc, 
        ref bool SaveAsUI, ref bool Cancel)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        bool isExtended = Globals.Factory.HasVstoObject(Doc);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // bool isExtended = Doc.HasVstoObject();
    
        if (isExtended)
        {
            // Use the following line of code in projects that target the .NET Framework 4.
            Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc);
    
            // In projects that target the .NET Framework 3.5, use the following line of code.
            // Microsoft.Office.Tools.Word.Document vstoDocument = Doc.GetVstoObject();
    
            if (vstoDocument.Controls.Contains(button))
            {
                vstoDocument.Controls.Remove(button);
                Globals.Ribbons.MyRibbon.addButtonCheckBox.Checked = false;
            }
        }
    }
    
  2. C#에서 ThisAddIn_Startup 이벤트 처리기에 다음 코드를 추가합니다. 이 코드는 C#에서 Application_DocumentBeforeSave 이벤트 처리기를 DocumentBeforeSave 이벤트와 연결하는 데 필요합니다.

    this.Application.DocumentBeforeSave += 
        new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(
        Application_DocumentBeforeSave);
    

사용자가 리본 메뉴의 확인란을 클릭할 때 컨트롤 추가 및 제거

마지막으로, 리본 메뉴에 추가한 확인란의 Click 이벤트 처리기를 수정하여 문서의 컨트롤을 추가하거나 제거합니다.

사용자가 리본 메뉴의 확인란을 클릭할 때 컨트롤을 추가 또는 제거하려면

  • MyRibbon.cs 또는 MyRibbon.vb 코드 파일에서 생성된 addButtonCheckBox_Click 및 addRichTextCheckBox_Click 이벤트 처리기를 다음 코드로 바꿉니다. 이 코드는 이러한 이벤트 처리기를 다시 정의하여 이 연습의 앞부분에서 ThisAddIn 클래스에 추가한 ToggleButtonOnDocument 및 ToggleRichTextControlOnDocument 메서드를 호출합니다.

    Private Sub addButtonCheckBox_Click(ByVal sender As System.Object, _
        ByVal e As RibbonControlEventArgs) Handles addButtonCheckBox.Click
        Globals.ThisAddIn.ToggleButtonOnDocument()
    End Sub
    
    Private Sub addRichTextCheckBox_Click(ByVal sender As System.Object, _
        ByVal e As RibbonControlEventArgs) Handles addRichTextCheckBox.Click
        Globals.ThisAddIn.ToggleRichTextControlOnDocument()
    End Sub
    
    private void addButtonCheckBox_Click(object sender, RibbonControlEventArgs e)
    {
        Globals.ThisAddIn.ToggleButtonOnDocument();
    }
    
    private void addRichTextCheckBox_Click(object sender, RibbonControlEventArgs e)
    {
        Globals.ThisAddIn.ToggleRichTextControlOnDocument();
    }
    

솔루션 테스트

리본 메뉴의 사용자 지정 탭에서 컨트롤을 선택하여 문서에 컨트롤을 추가합니다. 문서를 저장하면 Button 컨트롤이 제거됩니다.

솔루션을 테스트하려면

  1. F5 키를 눌러 프로젝트를 실행합니다.

  2. 활성 문서에서 Enter 키를 여러 번 눌러 문서에 비어 있는 새 단락을 추가합니다.

  3. 첫 번째 단락을 선택합니다.

  4. 추가 기능 탭을 클릭합니다.

  5. Add Controls 그룹에서 Add Button을 클릭합니다.

    첫 번째 단락에 단추가 나타납니다.

  6. 마지막 단락을 선택합니다.

  7. Add Controls 그룹에서 Add Rich Text Control을 클릭합니다.

    마지막 단락에 서식 있는 텍스트 콘텐츠 컨트롤이 추가됩니다.

  8. 문서를 저장합니다.

    문서에서 해당 단추가 제거됩니다.

다음 단계

응용 프로그램 수준 추가 기능의 컨트롤에 대한 자세한 내용은 다음 항목을 참조하십시오.

참고 항목

작업

방법: Office 문서에 Windows Forms 컨트롤 추가

방법: Word 문서에 콘텐츠 컨트롤 추가

개념

런타임에 Office 문서에 컨트롤 추가

Office 문서에서 동적 컨트롤 유지

런타임에 응용 프로그램 수준 추가 기능의 Word 문서 및 Excel 통합 문서 확장

기타 리소스

Word 솔루션

Word Add-In Dynamic Controls Sample