연습: Outlook에서 전자 메일 메시지와 함께 사용자 지정 작업 창 표시
이 연습에서는 각 전자 메일 메시지를 만들거나 열 때 사용자 지정 작업 창의 고유 인스턴스를 함께 표시하는 방법을 보여 줍니다. 사용자는 각 전자 메일 메시지의 리본 메뉴에 있는 단추를 사용하여 사용자 지정 작업 창을 표시하거나 숨길 수 있습니다.
적용 대상: 이 항목의 정보는 Outlook 2007 및 Outlook 2010의 응용 프로그램 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 응용 프로그램 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하십시오.
여러 탐색기 창이나 검사기 창에서 사용자 지정 작업 창을 함께 표시하려면 열리는 각 창에 대해 사용자 지정 작업 창의 새 인스턴스를 만들어야 합니다. Outlook 창에서의 사용자 지정 작업 창 동작에 대한 자세한 내용은 사용자 지정 작업 창 개요를 참조하십시오.
참고
이 연습에서는 코드에 숨겨진 논리를 보다 쉽게 설명하기 위해 추가 기능 코드를 여러 개의 작은 섹션으로 보여 줍니다. 이 연습에서 편집하는 각 파일의 전체 내용을 보려면 방법: Outlook에서 전자 메일 메시지를 보여 주는 사용자 지정 작업 창 표시를 참조하십시오.
이 연습에서는 다음 작업을 수행합니다.
사용자 지정 작업 창의 UI(사용자 인터페이스) 디자인
사용자 지정 리본 UI 만들기
전자 메일 메시지와 함께 사용자 지정 리본 UI 표시
검사기 창 및 사용자 지정 작업 창을 관리하기 위한 클래스 만들기
추가 기능에서 사용되는 리소스 초기화 및 정리
리본 메뉴 설정/해제 단추를 사용자 지정 작업 창과 동기화
참고
일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 설치한 Visual Studio 버전과 사용하는 설정에 따라 이러한 요소가 결정됩니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.
사전 요구 사항
이 연습을 완료하려면 다음 구성 요소가 필요합니다.
-
Microsoft Office 개발자 도구를 포함하는 Visual Studio 2010 버전입니다. 자세한 내용은 [Office 솔루션을 개발할 수 있도록 컴퓨터 구성](bb398242\(v=vs.100\).md)을 참조하십시오.
- Microsoft Office Outlook 2007 또는 Microsoft Outlook 2010
관련 비디오 데모를 보려면 How Do I: Use Task Panes in Outlook?을 참조하십시오.
프로젝트 만들기
사용자 지정 작업 창은 응용 프로그램 수준 추가 기능에서 구현됩니다. 우선 Outlook용 추가 기능 프로젝트를 만들어야 합니다.
새 프로젝트를 만들려면
OutlookMailItemTaskPane이라는 Outlook 추가 기능 프로젝트를 만듭니다. Outlook 추가 기능 프로젝트 템플릿을 사용합니다. 자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기를 참조하십시오.
Visual Studio에서 ThisAddIn.cs 또는 ThisAddIn.vb 코드 파일이 열리고 솔루션 탐색기에 OutlookMailItemTaskPane 프로젝트가 추가됩니다.
사용자 지정 작업 창의 사용자 인터페이스 디자인
사용자 지정 작업 창을 만드는 비주얼 디자이너는 없지만 사용자 정의 컨트롤을 원하는 UI로 디자인할 수 있습니다. 이 추가 기능의 사용자 지정 작업 창에는 TextBox 컨트롤이 포함된 간단한 UI가 있습니다. 이 연습의 뒷부분에서 사용자 지정 작업 창에 사용자 정의 컨트롤을 추가합니다.
사용자 지정 작업 창의 사용자 인터페이스를 디자인하려면
솔루션 탐색기에서 OutlookMailItemTaskPane 프로젝트를 클릭합니다.
프로젝트 메뉴에서 사용자 정의 컨트롤 추가를 클릭합니다.
새 항목 추가 대화 상자에서 사용자 정의 컨트롤의 이름을 TaskPaneControl로 바꾸고 추가를 클릭합니다.
사용자 정의 컨트롤이 디자이너에서 열립니다.
도구 상자의 공용 컨트롤 탭에서 TextBox 컨트롤을 사용자 정의 컨트롤로 끌어 옵니다.
리본 메뉴의 사용자 인터페이스 디자인
이 추가 기능의 목표 중 하나는 사용자가 각 전자 메일 메시지의 리본 메뉴에서 사용자 지정 작업 창을 숨기거나 표시할 수 있도록 하는 것입니다. 사용자 인터페이스를 제공하려면 사용자가 클릭하여 사용자 지정 작업 창을 표시하거나 숨길 수 있는 설정/해제 단추를 표시하는 사용자 지정 리본 UI를 만듭니다.
사용자 지정 리본 UI를 만들려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
새 항목 추가 대화 상자에서 **리본(비주얼 디자이너)**을 선택합니다.
새 리본 메뉴의 이름을 ManageTaskPaneRibbon으로 바꾸고 추가를 클릭합니다.
ManageTaskPaneRibbon.cs 또는 ManageTaskPaneRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.
리본 디자이너에서 group1을 클릭합니다.
속성 창에서 Label 속성을 "Task Pane Manager"로 설정합니다.
도구 상자의 Office 리본 컨트롤 탭에서 ToggleButton 컨트롤을 Task Pane Manager 그룹으로 끌어 옵니다.
toggleButton1을 클릭합니다.
속성 창에서 Label 속성을 "Show Task Pane"으로 설정합니다.
전자 메일 메시지와 함께 사용자 지정 리본 사용자 인터페이스 표시
이 연습에서 만든 사용자 지정 작업 창은 전자 메일 메시지가 포함된 검사기 창과 함께만 나타나도록 디자인되었습니다. 따라서 사용자 지정 리본 UI가 이 창과 함께만 표시되도록 해당 속성을 설정합니다.
전자 메일 메시지와 함께 사용자 지정 리본 UI를 표시하려면
리본 디자이너에서 ManageTaskPaneRibbon 리본 메뉴를 클릭합니다.
속성 창에서 RibbonType 옆의 드롭다운 목록을 클릭하고 Microsoft.Outlook.Mail.Compose 및 Microsoft.Outlook.Mail.Read를 선택합니다.
검사기 창 및 사용자 지정 작업 창을 관리하기 위한 클래스 만들기
추가 기능에서 특정 전자 메일 메시지와 연결된 사용자 지정 작업 창을 식별해야 하는 경우가 있습니다. 다음과 같은 경우가 이에 해당합니다.
사용자가 전자 메일 메시지를 닫은 경우. 이 경우 추가 기능에서는 해당 추가 기능이 사용한 리소스가 올바르게 정리되도록 메시지와 연결된 사용자 지정 작업 창을 제거해야 합니다.
사용자가 사용자 지정 작업 창을 닫은 경우. 이 경우 추가 기능에서는 전자 메일 메시지의 리본 메뉴에 있는 설정/해제 단추의 상태를 업데이트해야 합니다.
사용자가 리본 메뉴의 설정/해제 단추를 클릭한 경우. 이 경우 추가 기능에서는 메시지와 연결된 작업 창을 숨기거나 표시해야 합니다.
추가 기능에서 열려 있는 각 전자 메일 메시지와 연결된 사용자 지정 작업 창을 추적할 수 있도록 하려면 Inspector 및 CustomTaskPane 개체 쌍을 래핑하는 사용자 지정 클래스를 만듭니다. 이 클래스는 각 전자 메일 메시지에 대해 새 사용자 지정 작업 창 개체를 만들고 해당 전자 메일 메시지가 닫히면 사용자 지정 작업 창을 삭제합니다.
검사기 창 및 사용자 지정 작업 창을 관리하기 위한 클래스를 만들려면
솔루션 탐색기에서 ThisAddIn.cs 또는 ThisAddIn.vb 파일을 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.
다음 문을 파일의 맨 위에 추가합니다.
Imports System.Collections.Generic Imports Microsoft.Office.Tools Imports Office = Microsoft.Office.Core Imports Outlook = Microsoft.Office.Interop.Outlook
using Microsoft.Office.Tools;
다음 코드를 ThisAddIn.cs 또는 ThisAddIn.vb 파일의 ThisAddIn 클래스 외부에 추가합니다. Visual C#의 경우에는 이 코드를 OutlookMailItemTaskPane 네임스페이스 내에 추가합니다. InspectorWrapper 클래스는 Inspector 및 CustomTaskPane 개체 쌍을 관리합니다. 다음 단계에서는 이 클래스의 정의를 완료합니다.
Public Class InspectorWrapper Private inspector As Outlook.Inspector Private WithEvents inspectorEvents As Outlook.InspectorEvents_Event Private WithEvents taskPane As CustomTaskPane
public class InspectorWrapper { private Outlook.Inspector inspector; private CustomTaskPane taskPane;
이전 단계에서 추가한 코드 뒤에 다음 생성자를 추가합니다. 이 생성자는 전달된 Inspector 개체와 연결된 새 사용자 지정 작업 창을 만들고 초기화합니다. 또한 C#에서는 이 생성자가 Inspector 개체의 Close 이벤트와 CustomTaskPane 개체의 VisibleChanged 이벤트에 이벤트 처리기를 연결합니다.
Public Sub New(ByVal Inspector As Outlook.Inspector) Me.inspector = Inspector inspectorEvents = TryCast(Me.inspector, Outlook.InspectorEvents_Event) taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(New TaskPaneControl(), _ "My task pane", Inspector) End Sub
public InspectorWrapper(Outlook.Inspector Inspector) { inspector = Inspector; ((Outlook.InspectorEvents_Event)inspector).Close += new Outlook.InspectorEvents_CloseEventHandler(InspectorWrapper_Close); taskPane = Globals.ThisAddIn.CustomTaskPanes.Add( new TaskPaneControl(), "My task pane", inspector); taskPane.VisibleChanged += new EventHandler(TaskPane_VisibleChanged); }
이전 단계에서 추가한 코드 뒤에 다음 메서드를 추가합니다. 이 메서드는 InspectorWrapper 클래스에 포함된 CustomTaskPane 개체의 VisibleChanged 이벤트에 대한 이벤트 처리기입니다. 이 코드는 사용자가 사용자 지정 작업 창을 열거나 닫을 때마다 설정/해제 단추의 상태를 업데이트합니다.
Private Sub TaskPane_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs) _ Handles taskPane.VisibleChanged Globals.Ribbons(inspector).ManageTaskPaneRibbon.ToggleButton1.Checked = taskPane.Visible End Sub
void TaskPane_VisibleChanged(object sender, EventArgs e) { Globals.Ribbons[inspector].ManageTaskPaneRibbon.toggleButton1.Checked = taskPane.Visible; }
이전 단계에서 추가한 코드 뒤에 다음 메서드를 추가합니다. 이 메서드는 현재 전자 메일 메시지가 포함된 Inspector 개체의 Close 이벤트에 대한 이벤트 처리기입니다. 이 이벤트 처리기에서는 전자 메일 메시지가 닫힐 때 리소스를 해제합니다. 또한 CustomTaskPanes 컬렉션에서 현재 사용자 지정 작업 창을 제거합니다. 이렇게 하면 다음 전자 메일 메시지가 열릴 때 사용자 지정 작업 창의 인스턴스가 여러 개가 되지 않습니다.
Sub InspectorWrapper_Close() Handles inspectorEvents.Close If Not (taskPane Is Nothing) Then Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane) End If taskPane = Nothing Globals.ThisAddIn.InspectorWrappers.Remove(inspector) RemoveHandler inspectorEvents.Close, AddressOf InspectorWrapper_Close inspector = Nothing End Sub
void InspectorWrapper_Close() { if (taskPane != null) { Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane); } taskPane = null; Globals.ThisAddIn.InspectorWrappers.Remove(inspector); ((Outlook.InspectorEvents_Event)inspector).Close -= new Outlook.InspectorEvents_CloseEventHandler(InspectorWrapper_Close); inspector = null; }
이전 단계에서 추가한 코드 뒤에 다음 코드를 추가합니다. 이 연습의 뒷부분에서는 사용자 지정 리본 UI의 메서드에서 이 속성을 호출하여 사용자 지정 작업 창을 표시하거나 숨깁니다.
Public ReadOnly Property CustomTaskPane() As CustomTaskPane Get Return taskPane End Get End Property End Class
public CustomTaskPane CustomTaskPane { get { return taskPane; } } }
추가 기능에서 사용되는 리소스 초기화 및 정리
ThisAddIn 클래스에 코드를 추가하여 추가 기능이 로드될 때 추가 기능을 초기화하고 추가 기능이 언로드될 때 추가 기능에서 사용한 리소스를 정리합니다. NewInspector 이벤트에 대한 이벤트 처리기를 설정하고 이 이벤트 처리기에 기존의 모든 전자 메일 메시지를 전달하여 추가 기능을 초기화합니다. 추가 기능이 언로드될 때는 이벤트 처리기를 분리하고 해당 추가 기능에서 사용한 개체를 정리합니다.
추가 기능에서 사용되는 리소스를 초기화하고 정리하려면
ThisAddIn.cs 또는 ThisAddIn.vb 파일에서 ThisAddIn 클래스의 정의를 찾습니다.
ThisAddIn 클래스에 다음 선언을 추가합니다.
inspectorWrappersValue 필드에는 추가 기능에서 관리되는 모든 Inspector 및 InspectorWrapper 개체가 포함됩니다.
inspectors 필드에서는 현재 Outlook 인스턴스의 검사기 창 컬렉션에 대한 참조가 유지됩니다. 이 참조는 다음 단계에서 선언할 NewInspector 이벤트에 대한 이벤트 처리기가 들어 있는 메모리를 가비지 수집기에서 해제하지 않도록 합니다.
Private inspectorWrappersValue As New Dictionary(Of Outlook.Inspector, InspectorWrapper) Private WithEvents inspectors As Outlook.Inspectors
private Dictionary<Outlook.Inspector, InspectorWrapper> inspectorWrappersValue = new Dictionary<Outlook.Inspector, InspectorWrapper>(); private Outlook.Inspectors inspectors;
ThisAddIn_Startup 메서드를 다음 코드로 바꿉니다. 이 코드에서는 NewInspector 이벤트에 이벤트 처리기를 연결하고 기존의 모든 Inspector 개체를 이 이벤트 처리기에 전달합니다. Outlook이 이미 실행 중일 때 사용자가 추가 기능을 로드하면 추가 기능에서는 이 정보를 사용하여 이미 열려 있는 모든 전자 메일 메시지에 대해 사용자 지정 작업 창을 만듭니다.
Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Startup inspectors = Me.Application.Inspectors Dim inspector As Outlook.Inspector For Each inspector In inspectors Inspectors_NewInspector(inspector) Next inspector End Sub
private void ThisAddIn_Startup(object sender, System.EventArgs e) { inspectors = this.Application.Inspectors; inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler( Inspectors_NewInspector); foreach (Outlook.Inspector inspector in inspectors) { Inspectors_NewInspector(inspector); } }
ThisAddIn_ShutDown 메서드를 다음 코드로 바꿉니다. 이 코드에서는 NewInspector 이벤트 처리기를 분리하고 추가 기능에서 사용한 개체를 정리합니다.
Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Shutdown RemoveHandler inspectors.NewInspector, AddressOf Inspectors_NewInspector inspectors = Nothing inspectorWrappersValue = Nothing End Sub
private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { inspectors.NewInspector -= new Outlook.InspectorsEvents_NewInspectorEventHandler( Inspectors_NewInspector); inspectors = null; inspectorWrappersValue = null; }
ThisAddIn 클래스에 다음 NewInspector 이벤트 처리기를 추가합니다. 새 Inspector에 전자 메일 메시지가 들어 있으면 이 메서드에서는 새 InspectorWrapper 개체를 만들어 전자 메일 메시지와 해당 작업 창 간의 관계를 관리합니다.
Sub Inspectors_NewInspector(ByVal Inspector As Outlook.Inspector) _ Handles inspectors.NewInspector If TypeOf Inspector.CurrentItem Is Outlook.MailItem Then inspectorWrappersValue.Add(Inspector, New InspectorWrapper(Inspector)) End If End Sub
void Inspectors_NewInspector(Outlook.Inspector Inspector) { if (Inspector.CurrentItem is Outlook.MailItem) { inspectorWrappersValue.Add(Inspector, new InspectorWrapper(Inspector)); } }
ThisAddIn 클래스에 다음 속성을 추가합니다. 이 속성은 ThisAddIn 클래스 외부의 코드에 전용 inspectorWrappersValue 필드를 노출합니다.
Public ReadOnly Property InspectorWrappers() As Dictionary(Of Outlook.Inspector, InspectorWrapper) Get Return inspectorWrappersValue End Get End Property
public Dictionary<Outlook.Inspector, InspectorWrapper> InspectorWrappers { get { return inspectorWrappersValue; } }
검사점
프로젝트를 빌드하여 프로젝트가 오류 없이 컴파일되는지 확인합니다.
프로젝트를 빌드하려면
- 솔루션 탐색기에서 OutlookMailItemTaskPane 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 클릭합니다. 프로젝트가 오류 없이 컴파일되는지 확인합니다.
리본 메뉴 설정/해제 단추를 사용자 지정 작업 창과 동기화
설정/해제 단추는 작업 창이 표시될 때 누른 상태로 표시되고 작업 창이 숨겨져 있을 때는 누르지 않은 상태로 표시됩니다. 단추의 상태를 사용자 지정 작업 창과 동기화하려면 설정/해제 단추의 Click 이벤트 처리기를 수정합니다.
사용자 지정 작업 창을 설정/해제 단추와 동기화하려면
리본 디자이너에서 Show Task Pane 설정/해제 단추를 두 번 클릭합니다.
Visual Studio에서 이 설정/해제 단추의 Click 이벤트를 처리하는 toggleButton1_Click이라는 이벤트 처리기가 자동으로 생성됩니다. 또한 ManageTaskPaneRibbon.cs 또는 ManageTaskPaneRibbon.vb 파일이 코드 편집기에서 열립니다.
ManageTaskPaneRibbon.cs 또는 ManageTaskPaneRibbon.vb 파일의 맨 위에 다음 문을 추가합니다.
Imports Microsoft.Office.Tools.Ribbon Imports Outlook = Microsoft.Office.Interop.Outlook Imports Microsoft.Office.Tools
using Outlook = Microsoft.Office.Interop.Outlook; using Microsoft.Office.Tools;
toggleButton1_Click 이벤트 처리기를 다음 코드로 바꿉니다. 사용자가 설정/해제 단추를 클릭하면 이 메서드는 현재 검사기 창과 연결된 사용자 지정 작업 창을 숨기거나 표시합니다.
Private Sub ToggleButton1_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles ToggleButton1.Click Dim inspector As Outlook.Inspector = e.Control.Context Dim inspectorWrapper As InspectorWrapper = Globals.ThisAddIn.InspectorWrappers(inspector) Dim taskPane As CustomTaskPane = inspectorWrapper.CustomTaskPane If Not (taskPane Is Nothing) Then taskPane.Visible = TryCast(sender, RibbonToggleButton).Checked End If End Sub
private void toggleButton1_Click(object sender, RibbonControlEventArgs e) { Outlook.Inspector inspector = (Outlook.Inspector)e.Control.Context; InspectorWrapper inspectorWrapper = Globals.ThisAddIn.InspectorWrappers[inspector]; CustomTaskPane taskPane = inspectorWrapper.CustomTaskPane; if (taskPane != null) { taskPane.Visible = ((RibbonToggleButton)sender).Checked; } }
프로젝트 테스트
프로젝트를 디버깅하면 Outlook이 열리고 추가 기능이 로드됩니다. 추가 기능에서는 열려 있는 각 전자 메일 메시지와 함께 사용자 지정 작업 창의 고유 인스턴스를 표시합니다. 여러 개의 새 전자 메일 메시지를 만들어 코드를 테스트합니다.
추가 기능을 테스트하려면
F5 키를 누릅니다.
Outlook에서 새로 만들기를 클릭하여 새 전자 메일 메시지를 만듭니다.
전자 메일 메시지의 리본 메뉴에서 추가 기능 탭을 클릭하고 Show Task Pane 단추를 클릭합니다.
My task pane이라는 제목의 작업 창이 전자 메일 메시지와 함께 표시되는지 확인합니다.
작업 창의 텍스트 상자에 "First task pane"을 입력합니다.
작업 창을 닫습니다.
Show Task Pane 단추의 상태가 누르지 않은 상태로 변경되는지 확인합니다.
Show Task Pane 단추를 다시 클릭합니다.
작업 창이 열리고 텍스트 상자에 여전히 "First task pane"이라는 문자열이 들어 있는지 확인합니다.
Outlook에서 새로 만들기를 클릭하여 두 번째 전자 메일 메시지를 만듭니다.
전자 메일 메시지의 리본 메뉴에서 추가 기능 탭을 클릭하고 Show Task Pane 단추를 클릭합니다.
My task pane이라는 제목의 작업 창이 전자 메일 메시지와 함께 표시되고 이 작업 창의 텍스트 상자가 비어 있는지 확인합니다.
작업 창의 텍스트 상자에 "Second task pane"을 입력합니다.
포커스를 첫 번째 전자 메일 메시지로 이동합니다.
이 전자 메일 메시지와 연결된 작업 창의 텍스트 상자에 여전히 "First task pane"이 표시되는지 확인합니다.
이 추가 기능에서는 보다 고급 시나리오도 처리하며 이를 테스트해 볼 수도 있습니다. 예를 들어 다음 항목 및 이전 항목 단추를 사용하여 전자 메일을 볼 때의 동작을 테스트할 수 있습니다. 추가 기능을 언로드하고 여러 개의 전자 메일 메시지를 연 다음 추가 기능을 다시 로드할 때의 동작을 테스트할 수도 있습니다.
다음 단계
다음 항목에서는 사용자 지정 작업 창을 만드는 방법에 대해 더 자세히 설명합니다.
다른 응용 프로그램용 추가 기능의 사용자 지정 작업 창을 만듭니다. 사용자 지정 작업 창을 지원하는 응용 프로그램에 대한 자세한 내용은 사용자 지정 작업 창 개요를 참조하십시오.
사용자 지정 작업 창을 사용하여 Microsoft Office 응용 프로그램을 자동화합니다. 자세한 내용은 연습: 사용자 지정 작업 창을 사용하여 응용 프로그램 자동화를 참조하십시오.
Excel에서 사용자 지정 작업 창을 숨기거나 표시하는 데 사용할 수 있는 리본 메뉴 단추를 만듭니다. 자세한 내용은 연습: 사용자 지정 작업 창과 리본 단추 동기화를 참조하십시오.
참고 항목
작업
연습: 사용자 지정 작업 창을 사용하여 응용 프로그램 자동화
방법: Outlook에서 전자 메일 메시지를 보여 주는 사용자 지정 작업 창 표시