VS插件开发(4)-如何添加到指定到指定位置
1.先看结果
2.代码分析
3.GuidSymbol
4.如何获取GUID
1.先看结果
在上一篇里,我们讲解了下,菜单,分组和,按钮三个子目录,现在我们要来实践下,实现效果如下
菜单Test.png
在顶部菜单上添加一个Test,Test下有一级目录Test1,Test1下有二级菜单,包含一个TestButton按钮。
首先想下,这个结构应该是怎样的呢?
红框则是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是中国的一个人的人名(张小凡)
- GUID
有了这两个标志,每个控件都有了自己的唯一标识,这解决了如何区分的问题。
<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表示我们点击的菜单名称。