Visual Studio Package扩展——vsct文件简介
首先我们使用向导生成一个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文件简介的更多相关文章
- 【转】.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 ...
- Visual Studio Package 插件开发
背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...
- Visual Studio Package 插件开发(Visual Studio SDK)
背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包“不亦乐乎”...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一个,干嘛不用持续集成 ...
- Visual Studio Package 插件开发之自动生成实体工具
前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...
- Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)
前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...
- Visual Studio Code扩展
Visual Studio Code扩展 注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一 ...
- visual Studio 2017 扩展开发(一)《向Visual Studio菜单栏新增一个菜单》
最近有接触到关于visual studio 2017 扩展的开发,特此记录,也是为了督促自己去深入了解其原理. 开始开发Visual Studio 扩展,在这里我安装了visual studio 20 ...
- DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解
关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- Visual Studio Team Services Demo Generator简介
Visual Studio Team Services Demo Generator简介 Visual Studio Team Services Demo Generator能够帮助我们在Visual ...
随机推荐
- 用Linkedhashmap的LRU特性及SoftReference软引用构建二级缓存
LRU: least recently used(近期最少使用算法).LinkedHashMap构造函数可以指定其迭代顺序:LinkedHashMap(int initialCapacity, flo ...
- nyoj 题目44 子串和
子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...
- 【Android】实验7 BindService模拟通信 截止提交日期2016.5.3
实验7 BindService模拟通信 [目的] 实现启动端和BindService之间的双向通信 [要求] 1) 实现从启动端传递一个数据至BindService端: 2) 实现使用Bind ...
- HTML快速入门
我们经常上网浏览网页,来获取资讯.可网页是什么呢?它又是如何编写出来的呢? 网页又叫Web页面,我们经常可以在网页上看到文字.图片.视频等.我们所要说的HTML(超文本标记语言)就是构成网页文档的主要 ...
- php 值传递和引用传递的区别
值传递:函数范围内对值的任何改变在函数外部都会被忽略 引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 A:按值传递时,php必须复制值.特别是对于大型的字符串和对象来说,这将会是一个代 ...
- Spring 对数据库的支持
DAO DAO是用于访问数据的对象,大多数时候,我们将数据保存在数据库中,但这不是唯一选择. 用户也可以将数据保存在数据文件或者LDAP中 DAO屏蔽了数据操作的具体细节 Spring本质上希望能够以 ...
- Python列表及元组操作
#列表(一组有序数据的组合就是列表) #创建列表 #空列表 var = list()#var = [] print(var,type(var)) #具有多个元素的列表 var = ['风','水',' ...
- [bzoj3456] 城市规划 [递推+多项式求逆]
题面 bzoj权限题面 离线题面 思路 orz Miskcoo ! 先考虑怎么算这个图的数量 设$f(i)$表示$i$个点的联通有标号无向图个数,$g(i)$表示$n$个点的有标号无向图个数(可以不连 ...
- struts2的ajax支持
struts2支持一种stream类型的Result,这种类型的Result可以直接向客户端浏览器响应二进制,文本等, 我们可以再action里面生成文本响应,然后在客户端页面动态加载该响应即可. 直 ...
- 玩具谜题(NOIP2016)(纯模拟)
原题传送门 神奇的题目.. 朝左朝右异或一下就好了 细节处理一下,输出now的字符串 下面贴代码 #include<iostream> #include<cstdio> #in ...