연습: 런타임에 응용 프로그램 수준 추가 기능의 문서에 컨트롤 추가
응용 프로그램 수준 추가 기능을 사용하여 열려 있는 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 추가 기능 프로젝트를 만들려면
이름이 WordDynamicControls인 Word용 응용 프로그램 수준 추가 기능 프로젝트를 만듭니다. 자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기를 참조하십시오.
프로젝트가 .NET Framework 4를 대상으로 하는 경우 Microsoft.Office.Tools.Word.v4.0.Utilities.dll 어셈블리에 대한 참조를 추가합니다. 이 참조는 이 연습의 뒷부분에서 문서에 Windows Forms 컨트롤을 프로그래밍 방식으로 추가하는 데 필요합니다.
문서에 컨트롤을 추가하기 위한 UI 제공
Word의 리본 메뉴에 사용자 지정 탭을 추가합니다. 사용자는 탭의 확인란을 선택하여 문서에 컨트롤을 추가할 수 있습니다.
문서에 컨트롤을 추가하기 위한 UI를 제공하려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
새 항목 추가 대화 상자에서 **리본(비주얼 디자이너)**을 선택합니다.
새 리본 메뉴의 이름을 MyRibbon으로 변경하고 추가를 클릭합니다.
MyRibbon.cs 또는 MyRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.
리본 디자이너에서 group1 그룹을 클릭합니다.
속성 창에서 group1의 Label 속성을 "Add Controls"로 변경합니다.
도구 상자의 Office 리본 컨트롤 탭에 있는 CheckBox 컨트롤을 group1로 끌어 옵니다.
CheckBox1을 클릭하여 선택합니다.
속성 창에서 다음과 같이 속성을 변경합니다.
Property
값
Name
addButtonCheckBox
레이블
추가 단추
group1에 두 번째 확인란을 추가하고 다음 속성을 변경합니다.
Property
값
Name
addRichTextCheckBox
레이블
Add Rich Text Control
리본 디자이너에서 Add Button을 두 번 클릭합니다.
Add Button 확인란의 Click 이벤트 처리기가 코드 편집기에서 열립니다.
리본 디자이너로 돌아가서 Add Rich Text Control을 두 번 클릭합니다.
Add Rich Text Control 확인란의 Click 이벤트 처리기가 코드 편집기에서 열립니다.
이 연습의 뒷부분에서는 활성 문서의 컨트롤을 추가 및 제거하는 코드를 이러한 이벤트 처리기에 추가합니다.
활성 문서의 컨트롤 추가 및 제거
컨트롤을 추가하려면 먼저 추가 기능 코드에서 활성 문서를 Microsoft.Office.Tools.Word.Document 호스트 항목으로 변환해야 합니다. Visual Studio Tools for Office 솔루션에서는 관리되는 컨트롤을 호스트 항목에만 추가할 수 있으며 이러한 호스트 항목은 컨트롤의 컨테이너로 사용됩니다. 응용 프로그램 수준 추가 기능 프로젝트에서는 GetVstoObject 메서드를 사용하여 런타임에 호스트 항목을 만들 수 있습니다.
활성 문서에서 Button 또는 RichTextContentControl을 추가하거나 제거하기 위해 호출할 수 있는 메서드를 ThisAddIn 클래스에 추가합니다. 이 연습의 뒷부분에서는 리본 메뉴에 있는 확인란의 Click 이벤트 처리기에서 이러한 메서드를 호출합니다.
활성 문서의 컨트롤을 추가 및 제거하려면
솔루션 탐색기에서 ThisAddIn.cs 또는 ThisAddIn.vb를 두 번 클릭하여 코드 편집기에서 해당 파일을 엽니다.
ThisAddIn 클래스에 다음 코드를 추가합니다. 이 코드는 문서에 추가할 컨트롤을 나타내는 Button 및 RichTextContentControl 개체를 선언합니다.
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;
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); } }
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 컨트롤을 제거하려면
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; } } }
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 컨트롤이 제거됩니다.
솔루션을 테스트하려면
F5 키를 눌러 프로젝트를 실행합니다.
활성 문서에서 Enter 키를 여러 번 눌러 문서에 비어 있는 새 단락을 추가합니다.
첫 번째 단락을 선택합니다.
추가 기능 탭을 클릭합니다.
Add Controls 그룹에서 Add Button을 클릭합니다.
첫 번째 단락에 단추가 나타납니다.
마지막 단락을 선택합니다.
Add Controls 그룹에서 Add Rich Text Control을 클릭합니다.
마지막 단락에 서식 있는 텍스트 콘텐츠 컨트롤이 추가됩니다.
문서를 저장합니다.
문서에서 해당 단추가 제거됩니다.
다음 단계
응용 프로그램 수준 추가 기능의 컨트롤에 대한 자세한 내용은 다음 항목을 참조하십시오.
런타임에 다른 여러 형식의 컨트롤을 문서에 추가하고 문서가 다시 열릴 때 컨트롤을 다시 만드는 방법을 보여 주는 샘플은 Office 개발 샘플 및 연습에서 "Word 추가 기능 동적 컨트롤 샘플"을 참조하십시오.
Excel용 응용 프로그램 수준 추가 기능을 사용하여 워크시트에 컨트롤을 추가하는 방법을 보여 주는 연습은 연습: 런타임에 응용 프로그램 수준 프로젝트의 워크시트에 컨트롤 추가를 참조하십시오.
참고 항목
작업
방법: Office 문서에 Windows Forms 컨트롤 추가
개념
런타임에 응용 프로그램 수준 추가 기능의 Word 문서 및 Excel 통합 문서 확장