引き続きVisual Studioの拡張機能を作ります。
正味の話、前々回のウィザードにしたがって作る部分は公式サイトをみれば一発です。
さて今回は公式サイトの「VisualStudioのメニューバーにメニューを追加する」や「サブメニューを追加する」あたりを参考にしてメニューコマンド増やしたいと思います。
メニューコマンドを追加するにはvsctファイルに記述する。
公式サイトをみると「TopLevelMenu.vsctを開いて編集~」とあり、vsctファイルに色々と書き込むことでメニューを追加したりしています。なので VSPackage1.vsct を編集します。
ちなみにvsctファイルのXMLスキーマリファレンスはこちら。

実行すると、VisualStudioのメニュー「ツール」に My Command name という項目が追加されますが、Buttons にある Button で設定されます。追加される位置は Parent で指定されます。
id=MyMenuGroupを探してみると Groups にid=MyMenuGroupのGroupがあります。そしてその Parent は guid=”guidSHLMainMenu” id=”IDM_VS_MENU_TOOLS” 。
これはvsctファイルに記述が無いですが、VisualStudio上での位置を指定しています。これを変えることで好きな位置にコマンド追加することができます。
例えば、idをIDM_VS_MENU_EDITに変えるとメニューの「編集」にコマンドが追加されます。
<Group guid="guidVSPackage1CmdSet" id="MyMenuGroup" priority="0x0600">
<Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_EDIT"/>
</Group>
その他のguidやidはこちらをご参考に。
さて、サクッとコマンド「My Command name 2」を追加しましょう。
SymblosのGuidSymbolの中に My Command name のid、cmdidMyCommandがありますのでこれを参考に「My Command name 2」用のcmdidMyCommand2を追加します。
<GuidSymbol name="guidVSPackage1CmdSet" value="{0347ac17-ebae-4ec3-b6bb-72a5ba8a702c}">
<IDSymbol name="MyMenuGroup" value="0x1020" />
<IDSymbol name="cmdidMyCommand" value="0x0100" />
<IDSymbol name="cmdidMyCommand2" value="0x0102" />
<IDSymbol name="cmdidMyTool" value="0x0101" />
</GuidSymbol>
Buttonsにコマンドのボタンを追加。Iconのidを変えてアイコンも変更してみました。ButtonのpriorityはParentに追加される順番になります。試しにcmdidMyCommandのpriorityよりも前になるように設定しています。
<Button guid="guidVSPackage1CmdSet" id="cmdidMyCommand2" priority="0x0001" type="Button">
<Parent guid="guidVSPackage1CmdSet" id="MyMenuGroup" />
<Icon guid="guidImages" id="bmpPic2" />
<Strings>
<ButtonText>My Command name2</ButtonText>
</Strings>
</Button>
vsctファイルを弄っただけでコールバックメソッド等を記述していませんが、実行してみます。

バッチリです。
ちなみにクリックしても何も起こりません。まずは「My Command name」と同じ動作をするようにしてみます。
コールバックメソッドが記述されている VSPackage1Package.cs を開いて Initialize() メソッドに追加。
CommandID menuCommandID2 = new CommandID(GuidList.guidVSPackage1CmdSet, 0x0102);
MenuCommand menuItem2 = new MenuCommand(MenuItemCallback, menuCommandID2);
mcs.AddCommand(menuItem2);
CommandIDに渡すIDはPkgCmdIDListに定義するのが正しいのでしょうが、とりあえずベタ書き。変数もこんなネーミングをしていると殴られます。気をつけましょう。コールバックメッソッドとしては「My Command name」と同じにしています。
前回、エディタにHello, World.と追加するように変更していましたが、メッセージボックスを表示するように戻しておきましょう。
実行して、「My Command name2」をクリック。

上手くいきました。
MenuCommandに渡すコールバックメソッド(イベントハンドラ)を変えればめでたくコマンドの追加完了です。
でも、メニュー「ツール」に自作コマンドがポコポコ追加されても邪魔なのでサブメニュー化したいものです。
というわけで次回はサブメニュー化とコンテキストメニューへの追加、ショートカットキーの設定を行いたいと思います。vsctファイルとの格闘です。