チュートリアル : 実行時におけるアプリケーション レベルのアドインの文書へのコントロールの追加

アプリケーション レベルのアドインを使用して、任意の開いている Microsoft Office Word 文書にコントロールを追加できます。 このチュートリアルでは、リボンを使用してユーザーが文書に Button または RichTextContentControl を追加できるようにする方法を説明します。

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

このチュートリアルでは、次の作業について説明します。

  • 新しい Word アドイン プロジェクトを作成する。

  • 文書にコントロールを追加するためのユーザー インターフェイス (UI: User Interface) を提供する。

  • 実行時に文書にコントロールを追加する。

  • 文書からコントロールを削除する。

注意

お使いのマシンで、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. Word 用のアプリケーション レベルのアドイン プロジェクトを WordDynamicControls という名前で作成します。 詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。

  2. プロジェクトが .NET Framework 4 を対象としている場合は、Microsoft.Office.Tools.Word.v4.0.Utilities.dll アセンブリへの参照を追加します。 この参照は、このチュートリアルの後半で Windows フォーム コントロールをドキュメントにプログラムで追加するのに必要です。

文書にコントロールを追加するための UI の提供

Word のリボンにカスタム タブを追加します。 ユーザーはタブにあるチェック ボックスをオンにして、文書にコントロールを追加できます。

文書にコントロールを追加するための UI を提供するには

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

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

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

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

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

  5. [プロパティ] ウィンドウで、[group1]Label プロパティを [ボタンの追加] に変更します。

  6. ツールボックス[Office リボン コントロール] タブから、CheckBox コントロールを group1 にドラッグします。

  7. [CheckBox1] をクリックして選択します。

  8. [プロパティ] ウィンドウで、次のプロパティを変更します。

    プロパティ

    名前

    addButtonCheckBox

    Label

    ボタンの追加

  9. group1 に 2 つ目のチェック ボックスを追加し、次のプロパティを変更します。

    プロパティ

    名前

    addRichTextCheckBox

    Label

    リッチ テキスト コントロールの追加

  10. リボン デザイナーで [ボタンの追加] をダブルクリックします。

    [ボタンの追加] チェック ボックスの Click イベント ハンドラーがコード エディターで開きます。

  11. リボン デザイナーに戻り、[リッチ テキスト コントロールの追加] をダブルクリックします。

    [リッチ テキスト コントロールの追加] チェック ボックスの Click イベント ハンドラーがコード エディターで開きます。

このチュートリアルの後の手順で、これらのイベント ハンドラーに、アクティブな文書上でコントロールの追加や削除を行うためのコードを追加します。

アクティブな文書上でのコントロールの追加と削除

アドインのコードでは、コントロールを追加できるようにするには、アクティブな文書を Microsoft.Office.Tools.Word.Document ホスト項目に変換する必要があります。 Visual Studio Tools for Office ソリューションでは、マネージ コントロールは、そのコントロールのコンテナーとして機能するホスト項目に対してのみ追加できます。 アプリケーション レベルのアドイン プロジェクトでは、ホスト項目は GetVstoObject メソッドを使用して実行時に作成できます。

メソッドを ThisAddIn クラスに追加します。このクラスを呼び出して、アクティブな文書に対して Button または RichTextContentControl の追加や削除を実行できます。 このチュートリアルの後の手順で、リボンのチェック ボックスの Click イベント ハンドラーから、これらのメソッドを呼び出します。

アクティブな文書でコントロールの追加や削除を行うには

  1. ソリューション エクスプローラーで、ThisAddIn.cs または ThisAddIn.vb をダブルクリックし、コード エディターでファイルを開きます。

  2. 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;
    
  3. ThisAddIn クラスに次のメソッドを追加します。 ユーザーがリボンの [ボタンの追加] チェック ボックスをクリックした場合、チェック ボックスがオンになると、このメソッドにより、文書上で現在選択されている位置に 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 クラスに次のメソッドを追加します。 ユーザーがリボンの [リッチ テキスト コントロールの追加] チェック ボックスをクリックした場合、チェック ボックスがオンになると、このメソッドにより、文書上で現在選択されている位置に 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);
        }
    }
    

文書保存時におけるボタン コントロールの削除

文書が保存されて閉じられるとき、Windows フォーム コントロールは保持されません。 ただし、各クラスの ActiveX ラッパーは文書に残り、文書を再び開くと、このラッパーの境界線がエンド ユーザーに対して表示されます。 アドインで動的に作成された Windows フォーム コントロールをクリーンアップするには、いくつかの方法があります。 このチュートリアルでは、文書が閉じられるときに 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] グループで、[ボタンの追加] をクリックします。

    最初の段落にボタンが表示されます。

  6. 最後の段落を選択します。

  7. [Add Controls] グループで、[リッチ テキスト コントロールの追加] をクリックします。

    リッチ テキスト コントロールが最後の段落に追加されます。

  8. 文書を保存します。

    文書からボタンが削除されます。

次の手順

アプリケーション レベルのアドインのコントロールの詳細については、次の各トピックを参照してください。

参照

処理手順

方法 : Office ドキュメントに Windows フォーム コントロールを追加する

方法 : Word 文書にコンテンツ コントロールを追加する

Word アドインのダイナミック コントロールのサンプル

概念

Word ソリューション

実行時の Office ドキュメントへのコントロールの追加

Office ドキュメントでのダイナミック コントロールの永続化

アプリケーション レベルのアドインにおける実行時の Word 文書や Excel ブックの拡張