美文网首页
VS插件开发(4)-如何添加到指定到指定位置

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

作者: 最怕认真 | 来源:发表于2016-04-25 11:39 被阅读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。
    但是他们之间谁包含谁又该如何确认?谁是谁又该如何区分?

    • 唯一标识GUID和ID
      • GUID
        标示一个窗口,或者一个菜单,比如之前的Test菜单,它就有一个唯一的GUID来标示它,它是唯一的,会根据硬件以及IP等等软硬件生成一个全球独一无二的标志,可以在在线生成网站来生成。除了系统已经定义的菜单,我们自己写的时候,这个GUID是没有固定的,只要按规则生成即可
      • ID
        GUID之内的逻辑标志,什么意思?嗯,我们知道在Test下有一个Test1菜单,这个Test1是属于Test的,它的GUid也是Test的Guid,但如果有个Test2,如何区分呢,这就用到了ID了,它是在Guid下的一个唯一标示,用来区分某个Guid下的控件,举个例子,Guid是国名(中国),ID是中国的一个人的人名(张小凡)

    有了这两个标志,每个控件都有了自己的唯一标识,这解决了如何区分的问题。
    <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表示我们点击的菜单名称。

    相关文章

      网友评论

          本文标题:VS插件开发(4)-如何添加到指定到指定位置

          本文链接:https://www.haomeiwen.com/subject/yaafrttx.html