Office 2010 のコンテキスト メニューのカスタマイズ

概要 : Microsoft Office Fluent ユーザー インターフェイスのコンテキスト メニューをカスタマイズできる機能は、開発者からよく求められる機能です。ここでは、コンテキスト メニューをカスタマイズする方法と、Microsoft Word 2010 の既存のコンテキスト メニューを更新する例について説明します。

適用対象: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Word 2010

Microsoft アイコン Frank Rice (Microsoft Corporation)

2009 年 11 月

適用先 : Microsoft Office 2010

目次

  • Microsoft Office 2010 のコンテキスト メニューの紹介

  • コンテキスト メニューのカスタマイズの機能と制限

  • コンテキスト メニューのカスタマイズ例

  • まとめ

  • その他の技術情報

Microsoft Office 2010 のコンテキスト メニューの紹介

Microsoft Office 2010 より前のバージョンでは、Microsoft Office Fluent リボン ユーザー インターフェイス (UI) のコンテキスト メニュー (右クリック) メニューをカスタマイズする唯一の方法が CommandBars ソリューションを使用することでした。Office 2010 では、リボン UI のほかのコンポーネントと同じように、あらかじめ登録されたコンテキスト メニューをカスタマイズできます。この XML ベースのコンテキスト メニュー拡張性モデルは、おなじみのリボン拡張性モデルに基づいています。つまり、現在リボン UI のカスタマイズに使用しているのと同じ XML マークアップとコールバックを使用できます。また、リボン UI の拡張性を利用してコンテキスト メニューのカスタマイズを有効にしても、以前に作成されたコマンド バー ソリューションが「破壊」されることはありません。既に熟知しているリボン UI 拡張性のシナリオと同様、Office Open XML 形式のファイルを更新するか、Microsoft Visual Studio で作成されたアドインを使用することで、コンテキスト メニューをカスタマイズできます。

注意

リボン UI をカスタマイズする方法の詳細については、「2007 Office Fluent リボンをカスタマイズする (開発者向け)」という 3 部構成の記事を参照してください。

コンテキスト メニューのカスタマイズの機能と制限

リボンの拡張性を使用したコンテキスト メニューのカスタマイズには、多くのオプションが用意されてします。以下の機能が含まれています。

  • あらかじめ登録されたコントロールやカスタム コントロール (リボンのメニュー コントロールで現在サポートされている種類のもの) をあらかじめ登録されたコンテキスト メニューに次のような形で追加できます。

    • メニューの任意の位置にコントロールを追加する。

    • コントロールを任意のサブメニューに追加する。

    • カスタム サブメニューをあらかじめ登録されたコンテキスト メニューに追加する。

  • あらかじめ登録されたメニュー内のコントロールを非表示にする。

  • 任意のコンテキスト メニュー項目の前後にメニュー区切り線を追加する。

  • dynamicMenu コントロールを使用して、カスタム サブメニューを (サブメニューの展開時に) 動的に設定できます。

  • コンテキスト メニューに表示されるカスタム ギャラリーも動的に設定できます。

以下に、コンテキスト メニューのカスタマイズ時には利用できないオプションを示します。

  • コンテキスト メニューで現在サポートされていないコントロールの種類の追加 (コンボ ボックス、入力など)。これについては後で説明します。

  • あらかじめ登録されたコンテキスト メニュー コントロール用のコントロール ラベルおよびアイコンの再割り当て

  • あらかじめ登録されたコンテキスト メニューおよびサブメニュー内でのコントロールの並べ替え

  • あらかじめ登録されたコンテキスト メニューの動的な設定

コンテキスト メニューのカスタマイズ例

コンテキスト メニューのカスタマイズに使用するコマンドおよびコントロールの多くは、リボン UI のカスタマイズに使用するものと同じです。以下に、コンテキスト メニューで使用できるコントロールを示します。

  • control

  • button

  • checkBox

  • dynamicMenu

  • gallery

  • menu

  • menuSeparator

  • splitButton

  • toggleButton

コンテキスト メニューの拡張性がどのように機能するかを確認するために、以下の例を見てみましょう。この例では、Microsoft Word 2010 に表示されるテキスト コンテキスト メニューを変更して次のアクションを実行しています。

  • あらかじめ登録された [フォント] ボタンを非表示にする

  • トグル ボタンを追加する

  • [ハイパーリンク] ボタンの前に新しいボタンを挿入する

  • 区切りバーを挿入する

  • ボタン付きメニューを追加する

  • ギャラリー コントロールを追加する

  • 1 つのボタンとサブメニューを備えた動的メニュー (実行時に作成) を追加する

以下の手順では、Word 2010 でテキスト コンテキスト メニューをカスタマイズする XML マークアップを追加します。Office 14 カスタム UI エディターを使用すると容易にこのカスタマイズ XML を文書に追加できますが、このマークアップは COM アドインに対しても有効です。カスタム UI エディターは、Microsoft Office User Experience チームの Trang Luu によって作成されたフリー ツールであり、「OPENXMLDeveloper.org (英語)」 で入手できます。以下の手順では、このツールを使用します。

XML マークアップを Word 2010 文書に追加する

  1. Word 2010 を起動します。

  2. 文書にテキストを追加します。文書の本文に「=rand(5, 5)」と入力します。このステートメントによって、5 つの段落が文書に追加され、それぞれの段落はランダムなテキストの 5 つの文で構成されます。

  3. 文書を「TestDocument.docm」という名前のマクロ有効ファイルとして保存し、ファイルを閉じます。

  4. Office 2010 カスタム UI エディターを起動し、[ファイル] メニューの [開く] をクリックします。

  5. 作成したテスト文書の場所に移動し、[開く] をクリックします。

  6. 左側のウィンドウでファイル名を右クリックし、図 1 に示すように [Insert Office 2010 Custom UI Part] をクリックします。これで customUI14.xml パーツが文書に追加されます。

    図 1. カスタム UI エディターを使用して Office 2010 パーツを文書に挿入

    カスタム UI エディターの使用

  7. 右側のウィンドウで、次の XML マークアップを挿入します。

    <customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui">
       <contextMenus>
          <contextMenu idMso="ContextMenuText">
             <button idMso="FontDialog" visible="false" />
             <toggleButton id="MyToggle" label="My Toggle Button" />
             <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" />
             <menuSeparator id="MySeparator" />
             <menu id="MySubMenu" label="My Submenu" >
                <button id="MyButton2" label="Button on submenu" />
             </menu>
             <gallery id="galleryOne" label="My Gallery">
                <item id="item1" imageMso="HappyFace" />
                <item id="item2" imageMso="HappyFace" />
                <item id="item3" imageMso="HappyFace" />
                <item id="item4" imageMso="HappyFace" />
             </gallery>
             <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" />
          </contextMenu>
       </contextMenus>
    </customUI>
    
  8. この XML では、<contextMenu> タグの idMso="ContextMenuText" 属性の設定に示されているように、あらかじめ登録された [テキスト] コンテキスト メニューにコントロールを追加します。最初の設定ボタンは、あらかじめ登録された [フォント] ボタンの表示属性を false に設定し、このコマンドを非表示にします。toggleButton の後には、コンテキスト メニュー上の [ハイパーリンク] ボタンの前にinsertBeforeMso="HyperlinkInsert" の設定に基づいて 2 番目のボタンを挿入します。menuSeparator バーの後には、ボタンが 1 つ付いたメニュー コントロールを追加します。続いて、4 つのアイテムを持つギャラリー コントロールを追加します。最後に、コンテキスト メニューが表示されると、getContent 属性で指定されたメソッドが dynamicMenu コントロールによって呼び出されます。後でわかるように、このメソッドはフライアウトに対する追加のコントロールを実行時に返します。

  9. カスタム UI エディターの [検証] ボタンをクリックして、マークアップにエラーが含まれていないことを確認します。必要に応じてエラーを修正します。マークアップのエラーがなくなると、整形式であることを示すメッセージが表示されます。

  10. ファイルを保存し、エディターを閉じます。

  11. コード ウィンドウに次の VBA コードを挿入します。

  Sub GetButtonID(control As IRibbonControl)
      MsgBox ("You click the " & control.ID & " button.")
  End Sub
  Sub btnAction(control As IRibbonControl)
      MsgBox ("You clicked me!")
  End Sub
これらのメソッドは、コンテキスト メニュー上の 2 つのボタンで呼び出します。各メソッドには、プロシージャを呼び出したコントロールを表す IRibbonControl オブジェクト引数が渡されることに注意してください。IRibbonControl オブジェクトの Id プロパティは、どちらのボタンによってプロシージャが呼び出されたかを判断するために GetButtonID メソッドで使用されます。Id プロパティは、複数のコントロールで同じメソッドを呼び出し、コントロールの ID に基づいて別々のタスクを実行できるので、便利です。

次に、作成したコントロールに機能を追加する Microsoft Visual Basic for Applications (VBA) コードを追加します。

VBA コードを文書に追加する

  1. 前述の手順で作成した TestDocument.docm ファイルを開きます。

  2. [開発者] タブをクリックし、[Visual Basic] をクリックします。すると Visual Basic エディターが開きます。

  3. 左側のウィンドウで、ThisDocument ノードをダブルクリックします。コード ウィンドウが表示されます。

  4. 次のメソッドをコード ウィンドウに追加します。

    Sub GetMyContent(control As IRibbonControl, ByRef content)
    Dim xmlString As String
    xmlString = "<menu " & _
          "https://schemas.microsoft.com/office/2009/07/customui"">"
    xmlString = xmlString & "<button id=""btn1"" imageMso=""HappyFace"" " & _
       " label=""Click Me"" onAction=""btnAction"" />"
    xmlString = xmlString & "<menu id=""mnu"" label=""My Dynamic Menu"" > " & _
       "<button id=""btn2"" imageMso=""RecurrenceEdit"" /> " & _
       "<button id=""btn3"" imageMso=""CreateReportFromWizard"" /> " & _
       "</menu>"
    content = xmlString & "</menu>"
    
    End Sub
    

    このメソッドは、コンテキスト メニューの表示時に dynamicMenu コントロールの getContent 属性から呼び出されます。その目的はメニューを構築する XML マークアップを返すことです。このマークアップは、オリジナルの XML マークアップ内にハードコーディングされているかのように実装されています。

    VBA コードを確認すると、前述のように IRibbonControl オブジェクトを渡していることがわかります。また、このメソッドには content 引数を渡します。この引数では型を指定していないので、既定の Variant 型になります。この変数は、メソッドの実行終了時に Microsoft Office に返される XML を保持します。この XML 文字列はメニュー コントロールをインクルードするものであり、特定の名前空間で始まっている必要があります。すべての動的メニューは、この行をインクルードする必要があります。残りのコードは、メニュー (この例では 3 つのボタンを含むもの) を構成するコントロールをインクルードする文字列を作成します。最後に、表示のために Office 2010 に渡される content 変数に作成された文字列が割り当てられていることがわかります。

  5. Visual Basic エディターを閉じます。

  6. テキストのあるセクションを強調表示した状態で、マウスの右ボタンをクリックして、カスタマイズされたコンテキスト メニューを表示します。

参考のために、図 2 にカスタマイズする前の標準のテキスト コンテキスト メニューの様子を示します。

図 2. 標準のテキスト コンテキスト メニュー

標準テキストのショートカット メニュー

図 3 に、作成したカスタマイズ版のテキスト コンテキスト メニューを示します。

図 3. カスタム テキスト コンテキスト メニュー

ユーザー設定のテキスト ショートカット メニュー

まとめ

以前から、開発者は、コンテキスト適合性とマウス操作性の高いカスタム ソリューションを提供するために、コンテキスト メニューのカスタマイズに頼ってきました。リボン拡張性モデルによるこれらのカスタマイズは、コマンド バーを使用する場合に比べてこうした作業を単純にします。コントロールのさまざまな組み合わせの使用を検討して、目標とするユーザー インターフェイスを Office 2010 ソリューションで作成することをお勧めします。

その他の技術情報

ここで説明したテーマの詳細については、以下の技術情報を参照してください。

謝辞 : この記事の発表の準備を手伝ってくださった担当編集者の Linda Cannon にお礼を申し上げます。