首先我们使用向导生成一个package的扩展,里面就会发现一个vsct文件。vsct文件的全称是Visual Studio Command Table,它其实就是一个xml文件,通过一定的规则来描述visual Studio的command布局。

添加一个菜单项:

首先我们在vsct文件你们加一个菜单项:

<?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="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
        </Buttons>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
        </GuidSymbol>
    </Symbols>
</CommandTable>

其中高亮部分就是我添加的内容,执行效果如下:

再次添加一个菜单项:

再次添加一个菜单项也是非常简单的,只要在Buttons里面增加一项即可:

<?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="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
            <Button
guid="cmdSet"
id="cmdidMyCommand2"
priority="0x0101"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱2</ButtonText>
                </Strings>
            </Button>
        </Buttons>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
            <IDSymbol
name="cmdidMyCommand2"
value="0x0101" />
        </GuidSymbol>
    </Symbols>
</CommandTable>

生成的效果如下:

添加分组

现在我们来把菜单进行分组:首先在Groups项中添加一个Group,然后修改Button的ParentId即可。

<?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="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
            <Group
guid="cmdSet"
id="MyMenuGroup2"
priority="0x0601">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
            <Button
guid="cmdSet"
id="cmdidMyCommand2"
priority="0x0101"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup2" />
                <Strings>
                    <ButtonText>我的工具箱2</ButtonText>
                </Strings>
            </Button>
        </Buttons>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="MyMenuGroup2"
value="0x1021" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
            <IDSymbol
name="cmdidMyCommand2"
value="0x0101" />
        </GuidSymbol>
    </Symbols>
</CommandTable>

效果如下:

在菜单中添加图标

在菜单中添加图标要稍微麻烦点:首先需要添加一个Bitmaps分组,然后修改Button的Icon属性。

<?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="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
            <Group
guid="cmdSet"
id="MyMenuGroup2"
priority="0x0601">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Icon
guid="guidImages"
id="bmpPic1" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
            <Button
guid="cmdSet"
id="cmdidMyCommand2"
priority="0x0101"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup2" />
                <Icon
guid="guidImages"
id="bmpPicSearch" />
                <Strings>
                    <ButtonText>我的工具箱2</ButtonText>
                </Strings>
            </Button>
        </Buttons>
        <Bitmaps>
            <Bitmap
guid="guidImages"
href="Resources\Images.png"
usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
        </Bitmaps>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="MyMenuGroup2"
value="0x1021" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
            <IDSymbol
name="cmdidMyCommand2"
value="0x0101" />
        </GuidSymbol>
        <GuidSymbol
name="guidImages"
value="{f3517729-ad9a-4c24-9f72-288fafa0758d}" >
            <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>

生成的效果如下:

在菜单中关联命令

通过向导生成Package时,会自动生成一个Package的子类,重载其Initialize函数,在里面加入事件处理函数即可。向导默认已经给我们生成了一个示例,我们只需要修改其处理函数和添加新的按钮的事件即可。

protected
override
void Initialize()
    {
        base.Initialize();

// Add our command handlers for menu (commands must exist in the .vsct file)
        OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as
OleMenuCommandService;
        if (null != mcs)
        {
            // Create the command for the menu item.
            CommandID menuCommandID = new
CommandID(GuidList.guidVSPackage3CmdSet, (int)PkgCmdIDList.cmdidMyCommand);
            MenuCommand menuItem = new
MenuCommand((s, e) => System.Windows.Forms.MessageBox.Show("hello world"), menuCommandID);
            mcs.AddCommand(menuItem);
        }
    }

Visual Studio Package扩展——vsct文件简介的更多相关文章

  1. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  2. Visual Studio Package 插件开发

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...

  3. Visual Studio Package 插件开发(Visual Studio SDK)

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包“不亦乐乎”...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一个,干嘛不用持续集成 ...

  4. Visual Studio Package 插件开发之自动生成实体工具

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  5. Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  6. Visual Studio Code扩展

    Visual Studio Code扩展 注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一 ...

  7. visual Studio 2017 扩展开发(一)《向Visual Studio菜单栏新增一个菜单》

    最近有接触到关于visual studio 2017 扩展的开发,特此记录,也是为了督促自己去深入了解其原理. 开始开发Visual Studio 扩展,在这里我安装了visual studio 20 ...

  8. DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

    关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  9. Visual Studio Team Services Demo Generator简介

    Visual Studio Team Services Demo Generator简介 Visual Studio Team Services Demo Generator能够帮助我们在Visual ...

随机推荐

  1. Android记事本06

    昨天: activity的生命周期 今天: activity横竖屏切换的生命周期 遇到的问题: 为了匹配ADK,下载了更旧的版本SDK,布局文件仍然无法显示.

  2. RabbitMQ磁盘警报

    RabbitMQ磁盘警报 当可用磁盘空间低于配置的限制(默认为50MB)时,将触发警报,所有生产者将被阻止.目标是避免填满整个磁盘,这将导致节点上的所有写操作失败,并可能导致RabbitMQ终止.为了 ...

  3. InputStream 、 InputStreamReader 、 BufferedReader

    1.InputStream.OutputStream 处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputS ...

  4. [洛谷P4889]kls与flag

    题目大意:有$n$根竹竿,第$i$根竹竿在$i$位置,第​$i$根竹竿高度为​$h_i$,每根竹竿可以向左倒或向右倒,问有几对竹竿倒下后顶端重合. 题解:求出每根竹竿倒下后的位置,离散化,记录一下每个 ...

  5. [poj] 1375 Interval || 圆的切线&和直线的交点

    原题 每组数据给出一些圆(障碍物)的圆心和半径,一个点和一条线段,求站在这个点,能开到的线段的部分的左端点和右端点.没有则输出"No View" 相当于求过该点的圆的两条切线,切线 ...

  6. 【POJ 2387 Til the Cows Come Home】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 59755Accepted: 20336 Description Bessie is ...

  7. Maven项目消除奇怪的红叉

    当项目截然无误,然则Eclipse总是出现红叉的时候,右键点击项目->Maven->Update Project-,进而纠正之.很简答的操作. 木头大哥所发的文章均基于自身实践,各位江湖好 ...

  8. SyntaxError: Unexpected token ' in JSON at position 1

    刚才遇到一个问题: 在公司两个不同的环境竟然会出现错误 对比一下两个环境的数据,发现一个传来的是双引号的JSON字符串,一个是单引号.而当我用JSON.parse()时,就会报错!! 原因是JSON. ...

  9. Python 二进制,十进制,十六进制转换

    十六进制 到 十进制 使用 int() 函数 ,第一个参数是字符串 '0Xff' ,第二个参数是说明,这个字符串是几进制的数.  转化的结果是一个十进制数. >>> int('0xf ...

  10. UVALIVE 2955 Vivian's Problem

    参考: http://blog.csdn.net/acm_cxlove/article/details/7860735 感觉这里需要记录一下 #include <map> #include ...