• 如何把菜单添加到另外一个VSPackage的菜单里?


         在LearnVSXNow系列译文的第6篇发布后,有个朋友问了这么一个问题:“如果我想将一个Package的UI元素放至另外一个第三方的Package的菜单下,你有什么好的建议吗?这个东西现在在困扰着我。”

         我们知道,可以把package的菜单放到Visual Studio提供的菜单下,这其实和把菜单放到第三方package的菜单下没有本质的区别,当然前提是你得知道第三方的这个package的commandset这个guid和包含的Group或Menu的id。从他的回复可以看出,这些guid和id他是知道的,那我们就以这个作为前提,来看一下如何将自己的菜单项放到别人的菜单下。

         由于我手头上没有这个第三方的package,所以得先“造一个”出来:

    <?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"/>
     
        <Extern href="msobtnid.h"/>
     
        <Commands package="guidMenuPackagePkg">
     
            <Menus>
     
                <Menu guid="guidMenuPackageCmdSet" id="TopLevelMenu" priority="0x100" type="Menu">
                    <Parent guid="guidSHLMainMenu" id="IDG_VS_MM_BUILDDEBUGRUN" />
                    <Strings>
                        <ButtonText>Top Level Menu</ButtonText>
                        <CommandName>Top Level Menu</CommandName>
                    </Strings>
                </Menu>
     
                <Menu guid="guidMenuPackageCmdSet" id="Child2Menu" priority="0x050" type="Menu">
                    <Parent guid="guidMenuPackageCmdSet" id="TopLevelMenuGroup" />
                    <Strings>
                        <ButtonText>child2</ButtonText>
                    </Strings>
                </Menu>
     
            </Menus>
     
            <Groups>
                <Group guid="guidMenuPackageCmdSet" id="TopLevelMenuGroup" priority="0x0600">
                    <Parent guid="guidMenuPackageCmdSet" id="TopLevelMenu"/>
                </Group>
                <Group guid="guidMenuPackageCmdSet" id="Child2MenuGroup" priority="0x0600">
                    <Parent guid="guidMenuPackageCmdSet" id="Child2Menu"/>
                </Group>
            </Groups>
     
            <Buttons>            
     
                <Button guid="guidMenuPackageCmdSet" id="cmdidChild1Command" priority="0x0100" type="Button">
                    <Parent guid="guidMenuPackageCmdSet" id="TopLevelMenuGroup" />
                    <Icon guid="guidImages" id="bmpPic1" />
                    <Strings>
                        <CommandName>cmdidMyCommand</CommandName>
                        <ButtonText>Sub Menu Command</ButtonText>
                    </Strings>
                </Button>
     
                <Button guid="guidMenuPackageCmdSet" id="cmdidChild21Command" priority="0x0200" type="Button">
                    <Parent guid="guidMenuPackageCmdSet" id="Child2MenuGroup" />
                    <Icon guid="guidImages" id="bmpPic2" />
                    <Strings>
                        <CommandName>cmdidChild21Command</CommandName>
                        <ButtonText>child 2 Sub Menu Command 1</ButtonText>
                    </Strings>
                </Button>
     
                <Button guid="guidMenuPackageCmdSet" id="cmdidChild22Command" priority="0x0100" type="Button">
                    <Parent guid="guidMenuPackageCmdSet" id="Child2MenuGroup" />
                    <Icon guid="guidImages" id="bmpPic2" />
                    <Strings>
                        <CommandName>cmdidChild22Command</CommandName>
                        <ButtonText>child 2 Sub Menu Command 2</ButtonText>
                    </Strings>
                </Button>
            </Buttons>
     
            <Bitmaps>
                <Bitmap guid="guidImages" href="Resources\Images_32bit.bmp" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
            </Bitmaps>
     
        </Commands>
     
        <Symbols>
            <GuidSymbol name="guidMenuPackagePkg" value="{71568627-ddde-47f7-9ac6-ca2f82f1025c}" />
     
            <GuidSymbol name="guidMenuPackageCmdSet" value="{0215cb29-d60b-494c-b497-bfcaf0f12ab1}">
                <IDSymbol name="TopLevelMenu" value="0x1000" />
                <IDSymbol name="TopLevelMenuGroup" value="0x2000" />
                <IDSymbol name="Child2Menu" value="0x2100" />
                <IDSymbol name="Child2MenuGroup" value="0x2200" />
                <IDSymbol name="cmdidChild21Command" value="0x2201" />
                <IDSymbol name="cmdidChild22Command" value="0x2202" />
                <IDSymbol name="cmdidChild1Command" value="0x2300" />
            </GuidSymbol>
            <GuidSymbol name="guidImages" value="{3eb3ea0a-bf7f-41b4-8be7-273425f17ab0}" >
                <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" />
            </GuidSymbol>
        </Symbols>
    </CommandTable>

          <Parent guid="guidSHLMainMenu" id="IDG_VS_MM_BUILDDEBUGRUN" />这一句指定了我们的根菜单位于生成/调试/运行这个Group下面,关于Visual Studio的菜单的guid和id,参考这篇文章http://msdn.microsoft.com/en-us/library/cc826118.aspx

        

         这样,我们就“造出来”这么一些菜单:

    clip_image002

          可以看到,在vsct文件中,表示菜单项的节点,有Menu、Group、Button三种,Menu的Parent是Group,Group的Parent是Menu,Button的Parent是Group,呵呵,绕来绕去的绕的把我也绕糊涂了。大概意思就是:如果该菜单项没有子菜单,那么就用Button,并把Parent指向一个Group;如果该菜单项需要包含子菜单,那么就用Menu,并把Parent指向一个Group;Button和Menu不能直接放在Menu下,必须放在Group下。总之是Menu->Group-Menu->Group->Button之类的结构。

         package造好以后,下面新建一个package,看看能不能把它的菜单插入到上面这个package的菜单中。

         先把第一个package里的那些Symbols拷贝过来,如下:

    <Symbols>
            <!-- This is the package guid. -->
            <GuidSymbol name="guidSubPackagePkg" value="{476bb67a-2c73-4bf3-a063-d69740096e76}" />
     
            <!-- This is the guid used to group the menu commands together -->
            <GuidSymbol name="guidSubPackageCmdSet" value="{12c09527-eb61-4005-895e-0e9a2b06cc8c}">
     
                <IDSymbol name="MyMenuGroup" value="0x1020" />

    <IDSymbol name="cmdidMyCommand1" value="0x0100" />

    <IDSymbol name="cmdidMyCommand2" value="0x0200" />

            </GuidSymbol>
     
            <GuidSymbol name="guidImages" value="{80f8ca81-1c95-4706-8181-011253039685}" >
                <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" />
            </GuidSymbol>
     
     
            <!-- 从另外一个package里拷贝进来 -->
            <GuidSymbol name="guidMenuPackageCmdSet" value="{0215cb29-d60b-494c-b497-bfcaf0f12ab1}">            
                <IDSymbol name="TopLevelMenu" value="0x1000" />
                <IDSymbol name="TopLevelMenuGroup" value="0x2000" />
                <IDSymbol name="Child2Menu" value="0x2100" />
                <IDSymbol name="Child2MenuGroup" value="0x2200" />
                <IDSymbol name="cmdidChild21Command" value="0x2201" />
                <IDSymbol name="cmdidChild22Command" value="0x2202" />
     
                <IDSymbol name="cmdidChild1Command" value="0x2300" />
     
            </GuidSymbol>
        </Symbols>

        

         然后修改Commands节点下的内容如下:

    <Commands package="guidSubPackagePkg">
            <Groups>
     
                <!--定义一个Group,Parent是另外一个package的Top Level Menu-->
                <Group guid="guidSubPackageCmdSet" id="MyMenuGroup" priority="0x0600">
                    <Parent guid="guidMenuPackageCmdSet" id="TopLevelMenu"/>
                </Group>
     
            </Groups>
     
            <Buttons>
     
                <!--这个Button放在上面定义的Group里-->
                <Button guid="guidSubPackageCmdSet" id="cmdidMyCommand1" priority="0x0100" type="Button">
                    <Parent guid="guidSubPackageCmdSet" id="MyMenuGroup" />
                    <Icon guid="guidImages" id="bmpPic1" />
                    <Strings>
                        <CommandName>menu1</CommandName>
                        <ButtonText>Menu 1 From other package</ButtonText>
                    </Strings>
                </Button>
     
                <!--这个Button直接放在另外一个package的TopLevelMenuGroup里-->
                <Button guid="guidSubPackageCmdSet" id="cmdidMyCommand2" priority="0x0100" type="Button">
                    <Parent guid="guidMenuPackageCmdSet" id="TopLevelMenuGroup" />
                    <Icon guid="guidImages" id="bmpPic1" />
                    <Strings>
                        <CommandName>menu2</CommandName>
                        <ButtonText>Menu 2 From other package</ButtonText>
                    </Strings>
                </Button>
            </Buttons>
     
            <Bitmaps>
                <Bitmap guid="guidImages" href="Resources\Images_32bit.bmp" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
            </Bitmaps>
     
        </Commands>

         运行后,效果如下图:

    clip_image002[5]

  • 相关阅读:
    arcgis api for js入门开发系列二十打印地图的那些事
    arcgis api 3.x for js 入门开发系列十九图层在线编辑
    arcgis api 3.x for js 入门开发系列十八风向流动图(附源码下载)
    influxDB 0.9 C# 读写类
    [InfluxDB] 安装与配置
    分布式,集群,冗余的理解
    CentOS 7.0系统安装配置图解教程
    InfluxDB学习之InfluxDB的基本操作| Linux大学
    InfluxDB v1.6.4 下载
    InfluxDB中文文档
  • 原文地址:https://www.cnblogs.com/default/p/1682133.html
Copyright © 2020-2023  润新知