チュートリアル : Outlook で電子メール メッセージと共にカスタム作業ウィンドウを表示する

このチュートリアルでは、作成したり開いたりした電子メール メッセージごとにカスタム作業ウィンドウの固有のインスタンスを表示する方法について説明します。 このカスタム作業ウィンドウは、ユーザーが電子メール メッセージのリボン上のボタンを使用して表示/非表示を切り替えることができます。

対象: このトピックの情報は、Outlook 2007 と Outlook 2010 のアプリケーション レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。

1 つのカスタム作業ウィンドウを複数のエクスプローラー ウィンドウまたはインスペクター ウィンドウで表示するには、開くウィンドウごとにカスタム作業ウィンドウのインスタンスを作成します。 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 で作業ウィンドウを使用する)」を参照してください。

プロジェクトの作成

カスタム作業ウィンドウは、アプリケーション レベルのアドインに実装されます。 まず、Outlook 用のアドイン プロジェクトを作成します。

新しいプロジェクトを作成するには

  • OutlookMailItemTaskPane という名前の Outlook アドイン プロジェクトを作成します。 Outlook アドインのプロジェクト テンプレートを使用します。 詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。

    Visual Studio によって、ThisAddIn.cs コード ファイルまたは ThisAddIn.vb コード ファイルが開かれ、ソリューション エクスプローラーOutlookMailItemTaskPane プロジェクトが追加されます。

カスタム作業ウィンドウのユーザー インターフェイスのデザイン

カスタム作業ウィンドウにはビジュアルなデザイナーはありませんが、必要な UI でユーザー コントロールをデザインできます。 このアドインのカスタム作業ウィンドウの UI は、TextBox コントロールが 1 つだけ含まれる単純な構造です。 このチュートリアルの後半で、カスタム作業ウィンドウにユーザー コントロールを追加します。

カスタム作業ウィンドウのユーザー インターフェイスをデザインするには

  1. ソリューション エクスプローラー[OutlookMailItemTaskPane] プロジェクトをクリックします。

  2. [プロジェクト] メニューの [ユーザー コントロールの追加] をクリックします。

  3. [新しい項目の追加] ダイアログ ボックスで、ユーザー コントロールの名前を TaskPaneControl に変更し、[追加] をクリックします。

    ユーザー コントロールがデザイナーで開きます。

  4. [ツールボックス][コモン コントロール] タブから TextBox コントロールをユーザー コントロールにドラッグします。

リボンのユーザー インターフェイスのデザイン

このアドインの目的の 1 つは、ユーザーが各電子メール メッセージのリボンからカスタム作業ウィンドウの表示/非表示を切り替えられるようにすることです。 このようなユーザー インターフェイスを提供するために、ユーザーがクリックしてカスタム作業ウィンドウの表示/非表示を切り替えることができるトグル ボタンを表示する、カスタム リボン UI を作成します。

カスタム リボン UI を作成するには

  1. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  2. [新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナー)] をクリックします。

  3. 新しいリボンの名前を ManageTaskPaneRibbon に変更し、[追加] をクリックします。

    リボン デザイナーで ManageTaskPaneRibbon.cs ファイルまたは ManageTaskPaneRibbon.vb ファイルが開き、既定のタブとグループが表示されます。

  4. リボン デザイナーで [group1] をクリックします。

  5. [プロパティ] ウィンドウで、[ラベル] プロパティを Task Pane Manager に設定します。

  6. [ツールボックス][Office リボン コントロール] タブから ToggleButton コントロールを [Task Pane Manager] グループにドラッグします。

  7. [toggleButton1] をクリックします。

  8. [プロパティ] ウィンドウで、[ラベル] プロパティを Show Task Pane に設定します。

電子メール メッセージでのカスタム リボン ユーザー インターフェイスの表示

このチュートリアルで作成するカスタム作業ウィンドウは、電子メール メッセージが含まれるインスベクター ウィンドウにのみ表示されるように設計します。 そのため、そのようなウィンドウにのみカスタム リボン UI が表示されるようにプロパティを設定します。

電子メール メッセージにカスタム リボン UI を表示するには

  1. リボン デザイナーで [ManageTaskPaneRibbon] リボンをクリックします。

  2. [プロパティ] ウィンドウで、[RibbonType] の隣のドロップダウン リストをクリックし、[Microsoft.Outlook.Mail.Compose][Microsoft.Outlook.Mail.Read] を選択します。

インスベクター ウィンドウとカスタム作業ウィンドウを管理するクラスの作成

アドインで電子メール メッセージに関連付けられたカスタム作業ウィンドウを特定することが必要になる場合があります。 次のような場合に、これが必要になります。

  • ユーザーが電子メール メッセージを閉じたとき。 この場合、アドインは、使用したリソースが適切にクリーンアップされるように、対応するカスタム作業ウィンドウを削除する必要があります。

  • ユーザーがカスタム作業ウィンドウを閉じたとき。 この場合、アドインは電子メール メッセージのリボン上にあるトグル ボタンの状態を更新する必要があります。

  • ユーザーがリボン上のトグル ボタンをクリックしたとき。 この場合、アドインは対応する作業ウィンドウを表示するか非表示にする必要があります。

アドインが開いている個々の電子メール メッセージに関連付けられたカスタム作業ウィンドウを特定できるようにするには、Inspector オブジェクトと CustomTaskPane オブジェクトをラップするカスタム クラスを作成します。 このクラスは、電子メール メッセージごとに新しいカスタム作業ウィンドウを作成し、ユーザーが電子メール メッセージを閉じたときに、対応するカスタム作業ウィンドウを削除します。

インスベクター ウィンドウとカスタム作業ウィンドウを管理するクラスを作成するには

  1. ソリューション エクスプローラーで ThisAddIn.cs ファイルまたは ThisAddIn.vb ファイルを右クリックし、[コードの表示] をクリックします。

  2. ファイルの先頭に次のステートメントを追加します。

    Imports System.Collections.Generic
    Imports Microsoft.Office.Tools
    Imports Office = Microsoft.Office.Core
    Imports Outlook = Microsoft.Office.Interop.Outlook
    
    using Microsoft.Office.Tools;
    
  3. 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;
    
  4. 前の手順で追加したコードの後に次のコンストラクターを追加します。 このコンストラクターは、渡された 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);
    }
    
  5. 前の手順で追加したコードの後に次のメソッドを追加します。 このメソッドは、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;
    }
    
  6. 前の手順で追加したコードの後に次のメソッドを追加します。 このメソッドは、現在の電子メール メッセージが含まれる 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;
    }
    
  7. 前の手順で追加したコードの後に次のコードを追加します。 このチュートリアルの後半で、このプロパティをカスタム リボン UI のメソッドから呼び出して、カスタム作業ウィンドウの表示/非表示を切り替えます。

        Public ReadOnly Property CustomTaskPane() As CustomTaskPane
            Get
                Return taskPane
            End Get
        End Property
    End Class
    
        public CustomTaskPane CustomTaskPane
        {
            get
            {
                return taskPane;
            }
        }
    }
    

アドインの初期化とアドインが使用したリソースのクリーンアップ

読み込まれたアドインを初期化し、アドインがアンロードされたときにリソースをクリーンアップするコードを ThisAddIn クラスに追加します。 アドインを初期化するには、NewInspector イベントのイベント ハンドラーを作成し、既存の電子メール メッセージをすべてそのイベント ハンドラーに渡します。 アドインがアンロードされたときには、イベント ハンドラーをデタッチし、アドインが使用したオブジェクトをクリーンアップします。

アドインを初期化し、アドインが使用したリソースをクリーンアップするには

  1. ThisAddIn.cs ファイルまたは ThisAddIn.vb ファイルを開き、ThisAddIn クラスの定義を見つけます。

  2. 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;
    
  3. 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);
        }
    }
    
  4. 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;
    }
    
  5. 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));
        }
    }
    
  6. ThisAddIn クラスに次のプロパティを追加します。 このプロパティは、プライベート inspectorWrappersValue フィールドを ThisAddIn クラスの外側のコードに公開します。

    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 イベント ハンドラーを変更します。

カスタム作業ウィンドウをトグル ボタンと同期させるには

  1. リボン デザイナーで、[Show Task Pane] トグル ボタンをダブルクリックします。

    トグル ボタンの Click イベントを処理する toggleButton1_Click という名前のイベント ハンドラーが Visual Studio により自動的に生成されます。 また、コード エディターで ManageTaskPaneRibbon.cs ファイルまたは ManageTaskPaneRibbon.vb ファイルが開かれます。

  2. 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;
    
  3. 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 が開き、アドインが読み込まれます。 アドインによって、開かれた電子メール メッセージごとにカスタム作業ウィンドウの固有のインスタンスが表示されます。 コードのテスト用に新しい電子メール メッセージをいくつか作成します。

アドインをテストするには

  1. F5 キーを押します。

  2. Outlook で [新規作成] をクリックして新しい電子メール メッセージを作成します。

  3. 作成した電子メール メッセージのリボンの [アドイン] タブをクリックし、[Show Task Pane] ボタンをクリックします。

    [My task pane] というタイトルの作業ウィンドウが開き、そこに電子メール メッセージが表示されることを確認します。

  4. 作業ウィンドウのテキスト ボックスに「First task pane」と入力します。

  5. 作業ウィンドウを閉じます。

    [Show Task Pane] ボタンが押されていない状態に変わることを確認します。

  6. [Show Task Pane] ボタンをもう一度クリックします。

    作業ウィンドウが開き、テキスト ボックスが First task pane と表示されたままであることを確認します。

  7. Outlook で [新規作成] をクリックして電子メール メッセージをもう 1 つ作成します。

  8. 作成した電子メール メッセージのリボンの [アドイン] タブをクリックし、[Show Task Pane] ボタンをクリックします。

    電子メール メッセージと共に [My task pane] というタイトルの作業ウィンドウが開き、テキスト ボックスが空であることを確認します。

  9. 作業ウィンドウのテキスト ボックスに「Second task pane」と入力します。

  10. フォーカスを 1 つ目の電子メール メッセージへ移します。

    その電子メール メッセージに関連付けられた作業ウィンドウのテキスト ボックスが First task pane と表示されたままであることを確認します。

このアドインは、より高度なシナリオにも対応できます。それは実際の操作によって確認できます。 たとえば、[次のアイテム][前のアイテム] を使用して電子メールを表示するときの動作をテストすることができます。 また、アドインをアンロードし、電子メール メッセージをいくつか開き、再度アドインを読み込んだときの動作もテストできます。

次の手順

カスタム作業ウィンドウの作成方法の詳細については、以下のトピックを参照してください。

参照

処理手順

方法 : カスタム作業ウィンドウをアプリケーションに追加する

チュートリアル : カスタム作業ウィンドウからのアプリケーションの自動化

チュートリアル : カスタム作業ウィンドウとリボン ボタンの同期

方法 : Outlook で電子メール メッセージと共にカスタム作業ウィンドウを表示する

概念

カスタム作業ウィンドウの概要

複数のアプリケーション ウィンドウでカスタム作業ウィンドウを管理する

リボンの概要

Outlook オブジェクト モデルの概要

実行時のリボンへのアクセス