Visual Studio 扩展开发 手动创建vsct文件
张静茹2021/09/07软件综合 IP:山东

手动创建vsct文件

  vsct文件在vs package中有着重关重要的作用,它是代表Visual Studio的命令表(Command Table),Visual Studio利用vsct文件的定义为我们的package的命令创建用户界面。如果你查看这个文件的属性的话,你会发现该文件的Build Action是VSCTCompile。在package编译过程中,vsct文件会被编译成二进制的资源,并以ResourceName作为资源ID添加到XXXXXXXXXXXXsx资源文件中。

  正常情况下在创建项目过程中如果在“Select VSPackage Options”步骤时选了“Menu Command、Tool Window、Customer Editor”中的任意一项,那么项目生成时将会自动生成vsct文件。如果你创建的是一个空项目,这三项都没有选择那么又如何创建vsct文件呢?

1、在vs中创建任意名称的.vsct件。例:“vspackage.vsct”

2、打开package.cs文件,定义资源标记

    [ProvideMenuResource("Menus.ctmenu", 1)]    public sealed class CodeGeneratorPackage : Package

3、用记事本打开项目的.csproj文件

找到

<Content Include="vspackage.vsct" /> //不同vs版本可能会有所不同,可以直接搜索文件名

改为

<VSCTCompile Include="vspackage.vsct">
      <ResourceName>Menus.ctmenu</ResourceName>      //ResourceName可以随便定义,但要与package.cs文件中引用的一至   
</VSCTCompile>

4、重新打开项目并编译





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="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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>

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

upload_downloader_1630992608066_57809758.png

 

再次添加一个菜单项:

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

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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>

生成的效果如下:

upload_downloader_1630992608303_99226436.png

 

添加分组

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

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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>

效果如下:

upload_downloader_1630992608330_77591615.png

 

在菜单中添加图标

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

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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\XXXXXXXXXg" 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>

生成的效果如下:

upload_downloader_1630992608346_65007039.png

 

在菜单中关联命令

通过向导生成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) => XXXXXXXXXXXXXXXXXrms.MessageBox.Show("hello world"), menuCommandID);
            XXXXXXdCommand(menuItem);
        }
    }



XXXXXXXXXXXXXXXXXXXXXXX/lswweb/p/XXXXXXXXXXml

XXXXXXXXXXXXXXXXXXXXXXX/TianFang/p/XXXXXXXXXXml

来自:计算机科学 / 软件综合
0
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
张静茹
进士 学者 机友 笔友
文章
138
回复
1857
学术分
1
2010/12/30注册,4天11时前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}