首先我们使用向导生成一个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. [oldboy-django][2深入django]点击刷新验证码

    # 点击更新验证码,只要重新在发送一个请求即可 <img src="/check_code/" onclick="updateCode(this);" w ...

  2. HDU 4101 Ali and Baba (思路好题)

    与其说这是个博弈,倒不如说是个搜索.这题思路不错,感觉很难把情况考虑周全. 在地图外围填充一圈0,两次BFS,第一次从-1点出发,把从-1到达的0点以及包围0的那一圈石头标记出来.如下图: 1 1 1 ...

  3. 【bzoj4756】[Usaco2017 Jan]Promotion Counting 离散化+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832263.html 题目描述 The cows have once again tried to form a s ...

  4. ZOJ 1280 Interesting Lines | 求两直线交点

    原题: 求两直线交点 思路借鉴于:http://blog.csdn.net/zxy_snow/article/details/6341282 感谢大佬 #include<cstdio> # ...

  5. 纯css美化复选框,单选框,滑动条(range)

    <div class="box"> <!-- 借鉴地址:http://www.cnblogs.com/xiaoxianweb/p/5465607.html --& ...

  6. 转 android Listview,gridview局部刷新,部分刷新 (仿QQ动态评论局部刷新)

    转自:http://blog.csdn.net/jdsjlzx/article/details/45582719 众所周知Listview和Gridview的刷新界面的方式是调用adapter.not ...

  7. UVa10025 The ? 1 ? 2 ? ... ? n = k problem 数学思维+规律

    UVa10025 ? 1 ? 2 ? ... ? n = k problem The problem Given the following formula, one can set operator ...

  8. UVa10891 Game of Sum

    给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能从一端选取.两人都采用最优策略,A先手,问A和B各自得到数字的和的差值最大为多少? 区间DP F[i][j]表示区间i~j内A能得到的最大数 ...

  9. [codevs_1237]餐巾计划问题

    题目描述 一个餐厅在相继的N 天里,每天需用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧餐巾送到快洗部,洗一块需m天,其费用为 ...

  10. (计数器)NOIP模拟赛(神奇的数位DP题。。)

    没有原题传送门.. 手打原题QAQ [问题描述]     一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...