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 ...
随机推荐
- Leetcode 659.分割数组为连续子序列
分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [1,2,3 ...
- Android Canvas类介绍
当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...
- 【bzoj4884】[Lydsy2017年5月月赛]太空猫 dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6825431.html 题目描述 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏,你需要控制一只坐在迷你 ...
- [CF463D]Gargari and Permutations
题目大意:给你$k(2\leqslant k\leqslant5)$个$1\sim n(n\leqslant10^3)$的排列,求它们的最长子序列 题解:将$k$个排列中每个元素的位置记录下来.如果是 ...
- [ARC068F] Solitaire [DP]
题面 传送门 思路 单调性 首先,显然可以发现这些数在放进双端队列之后肯定是一个$V$形的排布:1在最中间,两边的数都是单调递增 那么我们拿出来的数,显然也可以划分成2个单调递减的子序列(因为我们也是 ...
- [codeforces] 527A Playing with Paper
原题 简单的gcd #include<cstdio> #include<algorithm> typedef long long ll; using namespace std ...
- POJ2374 Fence Obstacle Course 【线段树】
题目链接 POJ2374 题解 题意: 给出\(n\)个平行于\(x\)轴的栅栏,求从一侧栅栏的某个位置出发,绕过所有栅栏到达另一侧\(x = 0\)位置的最短水平距离 往上说都是线段树优化dp 我写 ...
- spring in action学习笔记七:@Conditional注解的用法
@Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...
- bzoj3643 Phi的反函数
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3643 [题解] n = p1^a1*p2^a2*...*pm^am phi(n) = p1( ...
- 简单粗暴!解决锐捷强制关闭VMware NAT Service的问题(图文教程)
众所周知毒瘤的锐捷会定时强制关闭NAT服务,导致虚拟机连不上网,进而你的虚拟机就成了孤儿,只能玩单机. 在一番百度后,得到了一种神仙破解办法.原理是把锐捷关闭服务时所用的搜索关键字改掉,这样锐捷就搜不 ...