VS插件开发(4)-如何添加到指定到指定位置

2016-04-25  本文已影响311人  最怕认真

1.先看结果
2.代码分析
3.GuidSymbol
4.如何获取GUID

1.先看结果

在上一篇里,我们讲解了下,菜单,分组和,按钮三个子目录,现在我们要来实践下,实现效果如下


菜单Test.png

在顶部菜单上添加一个Test,Test下有一级目录Test1,Test1下有二级菜单,包含一个TestButton按钮。
首先想下,这个结构应该是怎样的呢?

结构.png

红框则是Group,到这里你其实可以发现,不管是Menu还是Button都要依托Group存在。

2.代码分析

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <Extern href="stdidcmd.h"/>
  <Extern href="vsshlids.h"/>

  <Commands package="guidVSPackage2Pkg">

    <Menus >
      <Menu guid="Test" id="TestMenu" priority="0x1111" type="Menu">
        <Parent guid="guidSHLMainMenu" id="IDG_VS_MM_BUILDDEBUGRUN" />
        <Strings>
          <ButtonText>Test</ButtonText>
          <CommandName>Test</CommandName>
        </Strings>
      </Menu>

      <Menu guid="Test" id="TestMenu_1" priority="0x111" type="Menu">
        <Parent guid="Test" id="TestGroup"/>
        <Strings>
          <ButtonText>Test1</ButtonText>
          <CommandName>Test1</CommandName>
        </Strings>
      </Menu>
      
    </Menus>

    <Groups>
      <Group guid="Test" id="TestGroup" priority="0x0001">
        <Parent guid="Test" id="TestMenu"/>
      </Group>
      <Group guid="Test" id="TestGroup_1" priority="0x0001">
        <Parent guid="Test" id="TestMenu_1"/>
      </Group>
    </Groups>

    <Buttons>
      <Button guid="Test" id="TestButton" priority="0x0001">
        <Parent guid="Test" id="TestGroup_1"/>
        <Strings>
          <ButtonText> TestButton </ButtonText>
          <CommandName> TestButton </CommandName>
        </Strings>
      </Button>
    </Buttons>

    <Bitmaps>
      <Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
    </Bitmaps>
  </Commands>


  <Symbols>
    <GuidSymbol name="guidVSPackage2Pkg" value="{02d50a69-ed3d-4746-b813-68058f7f8391}" />

    <GuidSymbol name="Test" value="{fccdf8a0-8d64-4ff4-bd4e-6bc8447e0dca}">
      <IDSymbol name="TestMenu" value="0x1001"/>
      <IDSymbol name="TestMenu_1" value="0x1004"/>
      <IDSymbol name="TestGroup" value="0x1002"/>
      <IDSymbol name="TestGroup_1" value="0x1005"/>
      <IDSymbol name="TestButton" value="0x1003"/>
    </GuidSymbol>

    <GuidSymbol name="guidImages" value="{9da08d48-0438-4528-8cce-f3432f3f4218}" >
      <IDSymbol name="bmpPic1" value="1" />
      <IDSymbol name="bmpPic2" value="2" />
      <IDSymbol name="bmpPicSearch" value="3" />
      <IDSymbol name="bmpPicX" value="4" />
      <IDSymbol name="bmpPicArrows" value="5" />
      <IDSymbol name="bmpPicStrikethrough" value="6" />
    </GuidSymbol>
  </Symbols>

</CommandTable>

上面的结构已经指出,要想实现这个效果,要有2个Group,两个Menu(一个是在顶部的Test,一个是Test1),以及一个Button。
但是他们之间谁包含谁又该如何确认?谁是谁又该如何区分?

有了这两个标志,每个控件都有了自己的唯一标识,这解决了如何区分的问题。
<Parent guid="guidSHLMainMenu" id="IDG_VS_MM_BUILDDEBUGRUN" />
这是依托在vs原有的逻辑分组中,IDG_VS_MM_BUILDDEBUGRUN是包含“生成”和“调试”菜单的逻辑组。
如何知道谁包含谁?这便要用到parent这个字段。
<Parent guid="Test" id="TestGroup"/>
其中又包含两个字段,正是GUID和ID,如此便知道了自己是属于谁的。
至于其他的字段,都是很字面的意思,一看便知。

3.GuidSymbol

GuidSymbol 包含了很多条IDSymbol,GuidSymbol 用来定义一个GUID的,这其实相当于一个常量定义,不然你在用GUID的时候都要复制一长串的字符串。
IDSymbol自然是在GUID下的一些控件了,value就是ID了。

4.如何获取GUID

上面的代码是依附在主菜单上的,如果想在文件菜单下,或者编辑菜单下应该如何获取对应的GUID和ID呢。
https://msdn.microsoft.com/en-us/library/cc826118.aspx
或者
打开注册表
编辑器(打开运行窗口,输入regedit),在[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\General]找到该路径,右击-新建-DWORD(32-位)值(D),建立一个注册文件,将其命名为EnableVSIPLogging,并将其值改为1。按下Ctrl+Shift,用鼠标点击VS里的菜单,就会弹出一个VSDebug Message窗口,如图-6所示:


其中Guid和CmdID值就是我们需要的,NameLoc表示我们点击的菜单名称。
上一篇下一篇

猜你喜欢

热点阅读