VisualStudio2013の拡張機能を作る4 -サブメニューとしてコマンドを追加する-

前回でコマンドを増やすことができましたので、これらのコマンドをサブメニューの中に入れたいと思います。

公式サイトの「サブメニューを追加する」をみると

  1. vsctファイルを開いて
  2. IDSymbolを追加して
  3. Menusセクションにサブメニュー用のMenuを追加して
  4. GroupsセクションにGroupを追加して
  5. Buttonsセクションにサブメニューコマンド用のButtonを追加しろ

と書いてあります。

実は社内用の拡張機能を作った際にはこの部分でひっかかり、1,2ヵ月放置していました。

この公式ページの説明どおりにTopLevelMenuという名前のVSPackageを作って、説明どおりにIDSymbolやらMenuやらを追加すれば良かったのですが、説明を斜め読みのまま、

  1. VSPackage1という名前で作ったプロジェクトのvsctファイルの内容を書き換えよう。
  2. とりあえずIDSymbleを追加。
  3. MenusセクションへのMenu追加はコピペしてguidを書き換えよう。
  4. GroupsセクションのGroupを書き換えよう。
  5. 最後のコマンド用Buttonは既に作ったコマンドのParentのidを書き換えて使おう。

ってな感じで進めた結果、まったくサブメニュー化できませんでした。

どこを間違えていたかというと、GroupsセクションにGroupを追加する部分です。「追加」しなければいけないのですが、説明ページの内容に置き換えてしまったわけです。

<Groups>
    <Group guid="guidVSPackage1CmdSet" id="MyMenuGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
    </Group>
</Groups>

これを

<Groups>
    <Group guid="guidVSPackage1CmdSet" id="MyMenuGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
    </Group>
    <Group guid="guidVSPackage1CmdSet" id="SubMenuGroup" priority="0x0000">
        <Parent guid="guidVSPackage1CmdSet" id="SubMenu"/>
    </Group>
</Groups>

こうしないといけませんでした。

ちなみにid=”SubMenu”はMenuなのでこんな感じです。

<Menus>
    <Menu guid="guidVSPackage1CmdSet" id="SubMenu" priority="0x0100" type="Menu">
        <Parent guid="guidVSPackage1CmdSet" id="MyMenuGroup"/>
        <Strings>
            <ButtonText>Sub Menu</ButtonText>
            <CommandName>Sub Menu</CommandName>
        </Strings>
    </Menu>
</Menus>

で、各コマンド用ButtonのParentをid=”SubMenuGroup”に変更します。

<Button guid="guidVSPackage1CmdSet" id="cmdidMyCommand" priority="0x0100" type="Button">
    <Parent guid="guidVSPackage1CmdSet" id="SubMenuGroup" />
    <Icon guid="guidImages" id="bmpPic1" />
    <Strings>
        <ButtonText>My Command name</ButtonText>
    </Strings>
</Button>
  1. メニュー「ツール」の中にサブメニュー(id=”SubMenu”)を配置するために必要なのがParentを id=”IDM_VS_MENU_TOOLS” にしたGroup(id=”MyMenuGroup”)。
  2. サブメニューの中にコマンドを配置するために必要なのがParentを id=”SubMenu”にしたGroup(id=”SubMenuGroup”)。
  3. 配置するコマンドのParentはGroup(id=”SubMenuGroup”)にする。

サブメニューを親にしてコマンド配置用のGroupを作らないといけないんですね。よく読まずにコマンドの親をそのままサブメニューにしていたためにサブメニュー化できずに放置していました。

こうしてめでたくサブメニューになりました。

2014-01-17_193310

同じようにMenuやGroup、Buttonをもうワンセット作成し、一番上の親になるGroupのParentを以下のようにすればコンテキストメニューへ追加も完了です。

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN"/>

ショートカットキーの設定は簡単でKeyBindingsセクションにKeyBindingを追加してidに目的のコマンドIDを指定するだけです。修飾キーとして使えるものは入力補完で表示されます。

<KeyBindings>
<KeyBinding guid="guidVSPackage1CmdSet" id="cmdidMyCommand" editor="guidVSStd97" key1="M" mod1="Control Shift" key2="A" mod2="Control Shift" />
    <KeyBinding guid="guidVSPackage1CmdSet" id="cmdidMyCommand2" editor="guidVSStd97" key1="M" mod1="Control Shift" key2="B" mod2="Control Shift" />
</KeyBindings>

こうしてメンバから要望のあったサブメニュー化、コンテキストメニュー化が実現できて、めでたく社内公開できました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です