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

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表示我们点击的菜单名称。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容