연습: 런타임에 VSTO 추가 기능의 문서에 컨트롤 추가
VSTO 추가 기능을 사용하여 열려 있는 Microsoft Office Word 문서에 컨트롤을 추가할 수 있습니다. 이 연습에서는 리본을 사용하여 사용자가 Button 또는 RichTextContentControl을 문서에 추가할 수 있도록 하는 방법을 보여 줍니다.
적용 대상: 이 항목의 정보는 Word 2010의 VSTO 추가 기능 프로젝트에 적용됩니다. 자세한 내용은 Features Available by Office Application and Project Type을 참조하세요.
이 연습에서는 다음 작업을 수행합니다.
새 Word VSTO 추가 기능 프로젝트 만들기
문서에 컨트롤을 추가하는 UI(사용자 인터페이스) 제공
런타임에 문서에 컨트롤 추가
문서에서 컨트롤 제거
참고 항목
일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 IDE 개인 설정을 참조하세요.
필수 조건
이 연습을 완료하려면 다음과 같은 구성 요소가 필요합니다.
Microsoft Office 개발자 도구를 포함하는 Visual Studio 버전입니다. 자세한 내용은 Office 솔루션을 개발하기 위한 컴퓨터 구성을 참조하세요.
Word 2013 또는 Word 2010.
새 Word 추가 기능 프로젝트 만들기
Word VSTO 추가 기능 프로젝트를 만드는 작업부터 시작합니다.
새 Word VSTO 추가 기능 프로젝트를 만들려면
이름이 WordDynamicControls인 Word용 VSTO 추가 기능 프로젝트를 만듭니다. 자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기를 참조하세요.
Microsoft.Office.Tools.Word.v4.0.Utilities.dll 어셈블리에 대한 참조를 추가합니다. 이 참조는 이 연습의 뒷부분에서 프로그래밍 방식으로 문서에 Windows Forms 컨트롤을 추가하는 데 필요합니다.
문서에 컨트롤을 추가하는 UI 제공
Word에서 리본에 사용자 지정 탭을 추가합니다. 사용자는 탭에서 확인란을 선택하여 문서에 컨트롤을 추가할 수 있습니다.
문서에 컨트롤을 추가하는 UI를 제공하려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
새 항목 추가 대화 상자에서 리본(비주얼 디자이너)을 선택합니다.
새 리본 메뉴의 이름을 MyRibbon으로 변경하고 추가를 클릭합니다.
MyRibbon.cs 또는 MyRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.
리본 디자이너에서 group1 그룹을 클릭합니다.
속성 창에서 레이블 속성을 group1 에서 컨트롤 추가로 변경합니다.
도구 상자 의 Office 리본 컨트롤탭에서 CheckBox 컨트롤을 group1로 끌어옵니다.
CheckBox1 을 클릭하여 선택합니다.
속성 창에서 다음 속성을 변경합니다.
속성 값 이름 addButtonCheckBox Label 추가 단추 group1에 두 번째 확인란을 추가하고 다음 속성을 변경합니다.
속성 값 이름 addRichTextCheckBox Label 서식 있는 텍스트 컨트롤 추가 리본 디자이너에서 단추 추가를 두 번 클릭합니다.
Click 단추 추가 확인란의 이벤트 처리기가 코드 편집기에서 열립니다.
리본 디자이너로 돌아와서 서식 있는 텍스트 컨트롤 추가를 두 번 클릭합니다.
Click 서식 있는 텍스트 컨트롤 추가 확인란의 이벤트 처리기가 코드 편집기에서 열립니다.
이 연습의 뒷부분에서는 이러한 이벤트 처리기에 코드를 추가하여 활성 문서에서 컨트롤을 추가 및 제거합니다.
활성 문서에서 컨트롤을 추가 및 제거
VSTO 추가 기능 코드에서 컨트롤을 추가하려면 먼저 활성 문서를 Document호스트 항목 으로 변환해야 합니다. Office 솔루션에서 관리되는 컨트롤은 컨트롤에 대한 컨테이너 역할을 하는 호스트 항목에만 추가할 수 있습니다. VSTO 추가 기능 프로젝트에서는 런타임에 GetVstoObject
메서드를 사용하여 호스트 항목을 만들 수 있습니다.
활성 문서에서 ThisAddIn
또는 Button 를 추가 또는 제거하기 위해 호출할 수 있는 메서드를 RichTextContentControl 클래스에 추가합니다. 이 연습 뒷부분에서는 리본에 있는 확인란의 Click 이벤트 처리기에서 이러한 메서드를 호출합니다.
활성 문서에서 컨트롤을 추가 및 제거하려면
솔루션 탐색기에서 ThisAddIn.cs 또는 ThisAddIn.vb를 두 번 클릭하여 코드 편집기에서 파일을 엽니다.
ThisAddIn
클래스에 다음 코드를 추가합니다. 이 코드에서는 문서에 추가할 컨트롤을 나타내는 Button 및 RichTextContentControl 개체를 선언합니다.다음 메서드를
ThisAddIn
클래스에 추가합니다. 사용자가 리본의 단추 추가 확인란을 클릭하면 확인란이 선택된 경우 이 메서드가 문서의 현재 선택 영역에 Button 을 추가하고, 확인란 선택이 취소된 경우 Button 을 제거합니다.internal void ToggleButtonOnDocument() { Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument); 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
클래스에 추가합니다. 사용자가 리본의 서식 있는 텍스트 컨트롤 추가 확인란을 클릭하면 확인란이 선택된 경우 이 메서드가 문서의 현재 선택 영역에 RichTextContentControl 을 추가하고, 확인란 선택이 취소된 경우 RichTextContentControl 을 제거합니다.internal void ToggleRichTextControlOnDocument() { Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument); 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); } }
문서 저장 시 단추 컨트롤 제거
문서를 저장하고 닫으면 Windows Forms 컨트롤이 유지되지 않습니다. 그러나 각 컨트롤의 ActiveX 래퍼는 문서에 유지되므로 문서가 다시 열릴 때 이 래퍼의 테두리가 최종 사용자에게 표시됩니다. VSTO 추가 기능에서 동적으로 생성된 Windows Forms 컨트롤을 정리하는 방법에는 여러 가지가 있습니다. 이 연습에서는 문서가 저장될 때 프로그래밍 방식으로 Button 컨트롤을 제거합니다.
문서 저장 시 단추 컨트롤을 제거하려면
ThisAddIn.cs 또는 ThisAddIn.vb 코드 파일에서 다음 메서드를
ThisAddIn
클래스에 추가합니다. 이 메서드는 DocumentBeforeSave 이벤트의 기본 이벤트 처리기입니다. 저장된 문서에 연결된 Document 호스트 항목이 있는 경우 이벤트 처리기에서 해당 호스트 항목을 가져오고 Button 컨트롤이 있는 경우 이를 제거합니다.private void Application_DocumentBeforeSave(Word.Document Doc, ref bool SaveAsUI, ref bool Cancel) { bool isExtended = Globals.Factory.HasVstoObject(Doc); if (isExtended) { Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc); 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
이벤트 처리기를 다음 코드로 바꿉니다. 이 코드는 이 연습의 앞부분에서ToggleButtonOnDocument
클래스에 추가한ToggleRichTextControlOnDocument
및ThisAddIn
메서드를 호출하도록 이벤트 처리기를 다시 정의합니다.
솔루션 테스트
리본의 사용자 지정 탭에서 선택하여 문서에 컨트롤을 추가합니다. 문서를 저장하면 Button 컨트롤이 제거됩니다.
솔루션을 테스트하려면
F5 키를 눌러 프로젝트를 실행합니다.
활성 문서에서 Enter 키를 여러 번 눌러 문서에 비어 있는 새 단락을 추가합니다.
첫 번째 단락을 선택합니다.
추가 기능 탭을 클릭합니다.
컨트롤 추가 그룹에서 단추 추가를 클릭합니다.
첫 번째 단락에 단추가 나타납니다.
마지막 단락을 선택합니다.
컨트롤 추가 그룹에서 서식 있는 텍스트 컨트롤 추가를 클릭합니다.
서식 있는 텍스트 콘텐츠 컨트롤이 마지막 단락에 추가됩니다.
문서를 저장합니다.
문서에서 단추가 제거됩니다.
다음 단계
다음 항목에서 VSTO 추가 기능의 컨트롤에 대해 자세히 알아볼 수 있습니다.
런타임에 다양한 형식의 컨트롤을 문서에 추가하고 문서를 다시 열 때 컨트롤을 다시 만드는 방법을 보여 주는 샘플은 Office Development Samples and Walkthroughs의 Word 추가 기능 동적 컨트롤 샘플을 참조하세요.
Excel용 VSTO 추가 기능을 사용하여 워크시트에 컨트롤을 추가하는 방법을 보여 주는 연습은 연습: VSTO 추가 기능 프로젝트에서 런타임에 워크시트에 컨트롤 추가를 참조하세요.