1.先看結(jié)果
2.代碼分析
3.GuidSymbol
4.如何獲取GUID
1.先看結(jié)果
在上一篇里誉碴,我們講解了下,菜單舌缤,分組和箕戳,按鈕三個(gè)子目錄,現(xiàn)在我們要來(lái)實(shí)踐下国撵,實(shí)現(xiàn)效果如下
在頂部菜單上添加一個(gè)Test陵吸,Test下有一級(jí)目錄Test1,Test1下有二級(jí)菜單介牙,包含一個(gè)TestButton按鈕壮虫。
首先想下,這個(gè)結(jié)構(gòu)應(yīng)該是怎樣的呢环础?
紅框則是Group囚似,到這里你其實(shí)可以發(fā)現(xiàn),不管是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>
上面的結(jié)構(gòu)已經(jīng)指出饶唤,要想實(shí)現(xiàn)這個(gè)效果,要有2個(gè)Group贯钩,兩個(gè)Menu(一個(gè)是在頂部的Test募狂,一個(gè)是Test1),以及一個(gè)Button角雷。
但是他們之間誰(shuí)包含誰(shuí)又該如何確認(rèn)熬尺?誰(shuí)是誰(shuí)又該如何區(qū)分?
- 唯一標(biāo)識(shí)GUID和ID
- GUID
標(biāo)示一個(gè)窗口谓罗,或者一個(gè)菜單粱哼,比如之前的Test菜單,它就有一個(gè)唯一的GUID來(lái)標(biāo)示它檩咱,它是唯一的揭措,會(huì)根據(jù)硬件以及IP等等軟硬件生成一個(gè)全球獨(dú)一無(wú)二的標(biāo)志,可以在在線生成網(wǎng)站來(lái)生成刻蚯。除了系統(tǒng)已經(jīng)定義的菜單绊含,我們自己寫的時(shí)候,這個(gè)GUID是沒有固定的炊汹,只要按規(guī)則生成即可 - ID
GUID之內(nèi)的邏輯標(biāo)志躬充,什么意思?嗯,我們知道在Test下有一個(gè)Test1菜單充甚,這個(gè)Test1是屬于Test的以政,它的GUid也是Test的Guid,但如果有個(gè)Test2伴找,如何區(qū)分呢盈蛮,這就用到了ID了,它是在Guid下的一個(gè)唯一標(biāo)示技矮,用來(lái)區(qū)分某個(gè)Guid下的控件抖誉,舉個(gè)例子,Guid是國(guó)名(中國(guó))衰倦,ID是中國(guó)的一個(gè)人的人名(張小凡)
- GUID
有了這兩個(gè)標(biāo)志袒炉,每個(gè)控件都有了自己的唯一標(biāo)識(shí),這解決了如何區(qū)分的問題樊零。
<Parent guid="guidSHLMainMenu" id="IDG_VS_MM_BUILDDEBUGRUN" />
這是依托在vs原有的邏輯分組中梳杏,IDG_VS_MM_BUILDDEBUGRUN是包含“生成”和“調(diào)試”菜單的邏輯組。
如何知道誰(shuí)包含誰(shuí)淹接?這便要用到parent這個(gè)字段。
<Parent guid="Test" id="TestGroup"/>
其中又包含兩個(gè)字段叛溢,正是GUID和ID塑悼,如此便知道了自己是屬于誰(shuí)的。
至于其他的字段楷掉,都是很字面的意思厢蒜,一看便知。
3.GuidSymbol
GuidSymbol 包含了很多條IDSymbol烹植,GuidSymbol 用來(lái)定義一個(gè)GUID的斑鸦,這其實(shí)相當(dāng)于一個(gè)常量定義,不然你在用GUID的時(shí)候都要復(fù)制一長(zhǎng)串的字符串草雕。
IDSymbol自然是在GUID下的一些控件了巷屿,value就是ID了。
4.如何獲取GUID
上面的代碼是依附在主菜單上的墩虹,如果想在文件菜單下嘱巾,或者編輯菜單下應(yīng)該如何獲取對(duì)應(yīng)的GUID和ID呢。
https://msdn.microsoft.com/en-us/library/cc826118.aspx
或者
打開注冊(cè)表
編輯器(打開運(yùn)行窗口诫钓,輸入regedit)旬昭,在[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\General]找到該路徑,右擊-新建-DWORD(32-位)值(D)菌湃,建立一個(gè)注冊(cè)文件问拘,將其命名為EnableVSIPLogging,并將其值改為1。按下Ctrl+Shift骤坐,用鼠標(biāo)點(diǎn)擊VS里的菜單绪杏,就會(huì)彈出一個(gè)VSDebug Message窗口,如圖-6所示:
其中Guid和CmdID值就是我們需要的或油,NameLoc表示我們點(diǎn)擊的菜單名稱寞忿。