首先我们使用向导生成一个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. LightGBM的并行优化--机器学习-周振洋

    LightGBM的并行优化 上一篇文章介绍了LightGBM算法的特点,总结起来LightGBM采用Histogram算法进行特征选择以及采用Leaf-wise的决策树生长策略,使其在一批以树模型为基 ...

  2. leetcode 208. 实现 Trie (前缀树)

    实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert(" ...

  3. Android事件分发机制详解(2)----分析ViewGruop的事件分发

    首先,我们需要 知道什么是ViewGroup,它和普通的View有什么区别? ViewGroup就是一组View的集合,它包含很多子View和ViewGroup,是Android 所有布局的父类或间接 ...

  4. poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)

    Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14113   Accepted: 6260 Descr ...

  5. 使用SecureCRT设置linux系统登录的ssh公钥认证

    1.修改ssh配置文件/etc/ssh/sshd_configRSAAuthentication yes                             //使用RSA加密算法PubkeyAu ...

  6. 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆

    题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...

  7. 《c程序设计语言》读书笔记-5.4-指针实现strend

    #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> ...

  8. 让DIV的滚动条自动滚动到最底部 - 3种方法

    要制作一个在线聊天的程序,在做最后的修饰时,需要对获得的信息即时滚动以保证用户总能看到最新消息. 聊天程序是基于AJAX设计的,没有用框架,消息容器是一个DIV,所以问题就在于如何控制DIV的滚动条. ...

  9. 疫情控制(NOIP2012)庆祝2012满贯!٩(๑•◡-๑)۶ⒽⓤⒼ

    丧病至极的D2T3啊! 好吧~ 先放个传送门~ 原题传送门 好吧,这道题呢.. 根据题意我们可以很明显的看出来 军队往上走的越多(在没到根节点之前),效益一定越大.. 所以可以分情况讨论: 对于无法走 ...

  10. 第2章 掌握C++

    参考: https://blog.csdn.net/u014162133/article/details/46573873 1.C++主要特点: 封装性(Encapsulation):把数据与操作数据 ...