惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
有赞技术团队
有赞技术团队
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
月光博客
月光博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog

博客园 - sema

Netron开发快速上手(二):Netron序列化 发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart Netron源码解读(一):GraphControl画布对象 Netron开发快速上手(一):GraphControl,Shape,Connector和Connection FileSystemWatcher事件多次触发的解决方法 IBatis.Net 中的数据类型转换 深入浅出之正则表达式(二) 深入浅出之正则表达式(一) 在.NET环境中实现每日构建(Daily Build)--NAnt篇 自动向网页Post信息并提取返回的信息 在C#中利用自动化模型操纵Word VS.NET 2003集成环境插件开发指南(三)----操纵VS开发环境(完结篇) VS.NET 2003集成环境插件开发指南(一)----操纵菜单 后期写作计划 利用反射解决QueryString和Session中的参数绑定问题 开发Visual Studio风格的用户界面--MagicLibrary使用指南 Log4Net使用指南 一些写英文简历的词汇吧 关于一些大学课程名的中文翻译
VS.NET 2003集成环境插件开发指南(二)----使用窗口
sema · 2005-03-29 · via 博客园 - sema

前面一篇文章写了如何操作VS.NET开发环境里的菜单,本文继续讲如何在VS集成环境里使用窗口 一、             使用窗口

1、   使用WinForm窗口

VS.NET中显示WinForm窗口非常容易,和平常编写WinForm程序没什么两样,步骤如下:

l          在项目里添加一个WinForm窗体

l          修改WinForm窗体的构造函数

VS环境的根对象DTE对象传入,以便在WinForm中可以操纵开发环境

          public class MyForm : System.Windows.Forms.Form

          {       

private EnvDTE.DTE applicationObject;

         public MyForm(EnvDTE.DTE applicationObject)

         {

              InitializeComponent();

              this.applicationObject = applicationObject;

             

          }

l          Connect文件的Exec函数里生成并显示WinForm窗体。

              MyForm form = new MyForm(this.applicationObject.DTE);

              form.ShowDialog();

注意:这里的this.applicationObject_DTE接口指针,它的一个成员DTE成员才是DTE对象,不能直接用类型转换如(DTE) this.applicationObject


图-1  在VS集成环境里显WinForm窗体 

2、   使用工具窗口

VS.NET的工具窗口指的是类似“解决方案资源管理器”,“类视图”,“工具箱”这样停靠在上下左右侧边的窗口。而如代码编辑窗口这样的窗口,需要用VSIP进行开发,外接程序插件是没有办法开发这类窗口的。

根据MSDN里的资料,如果要开发侧边工具窗口,是件非常繁琐的事情。因为VS.NET是基于COM开发的,所以开发出来的侧边工具窗口也需要实现一系列接口,也就是说,不能直接使用.NET程序集。幸而已经有人做了这件事情,开发了一个将.NET用户控件包装成COM组件的容器VSUserControlHostLib,使得我们只需要开发出.NET用户控件,就可以将其嵌入到VS集成环境里了

开发步骤:

1、   生成Addin项目

2、   在项目中添加VSUserControlHost.dll引用

3、   Connect.cs文件的OnConnection方法中添加显示窗口的代码

下面是代码示例:(添加在OnConnect方法中)

//GUID串可以用VS开发环境里菜单命令“工具à创建GUID”弹出的对话框创建

         string guidstr = "{65FADCBF-63D2-448b-8A4B-393D7E751345}";

         object objTemp = null;

         VSUserControlHostLib.IVSUserControlHostCtl objControl = null;

         //create the 'Explorer' tool window

         /*

              [C#]

              返回一个 Window 对象

              public Window CreateToolWindow(

              AddIn AddInInst,   //必选项。其生存期决定工具窗口生存期的 AddIn 对象

              string ProgID,         //必选项。Document 对象或 ActiveX 控件的编程 ID

              string Caption,    //新工具窗口的标题

              string GuidPosition,   //新工具窗口的唯一标识符,可用作 Window.Item 的索引

              ref object DocObj  //工具窗口中要承载的 Document 对象或控件

              );

          */

         //这里先生成容器窗口,返回的控件对象在objTemp

         windowExplorer = applicationObject.Windows.CreateToolWindow(

addInInstance,

"VSUserControlHost.VSUserControlHostCtl",

"菜单浏览器",

guidstr,

ref objTemp);

         //使用容器窗口时,必须在调用该容器控件前设置其为可见,否者将会不能正常显示

         windowExplorer.Visible = true;

         windowExplorer.IsFloating = false;

         //将返回的工具窗口转换为容器对象

         objControl = (VSUserControlHostLib.IVSUserControlHostCtl)objTemp;

         System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();

         //用容器对象包含用户控件,

         menuExplorer = (MenuExplore)objControl.HostUserControl(asm.Location,

"MenuBrowser.MenuExplore");

         //设置窗口的图标

//windowExplorer.SetTabPicture()

              //DTE对象赋给窗口

menuExplorer.Application = applicationObject;

说明:

l          生成工具窗口:

以上代码先用CreateToolWindow函数生成工具窗口,工具窗口里承载的VSUserControlHost.VSUserControlHostCtl类型控件由objTemp对象返回

l          设置可见性:

将工具窗口设置为可见,非浮动

l          获取IVSUserControlHostCtl接口:

将返回的工具窗口中承载的控件对象objTemp转换为IVSUserControlHostCtl接口类型,并赋给objControl对象

l          加载用户控件:

objControlHostUserControl方法加载指定程序集的指定用户控件对象,上面代码中因为MenuBrowser.MenuExplore类是在插件项目的程序集里,所以用System.Reflection.Assembly.GetExecutingAssembly()方法获取当前程序集位置。如果用户控件是在其他程序集里,需要根据实际情况指定程序集位置

4、   最后还应该在OnDisconnection方法里关闭窗口

if(windowExplorer!= null)

{

     windowExplorer.Visible = false;

}

                  下图就是笔者用来列举所有的系统菜单对象名称的一个插件,使用的就是工具窗口

 

图-2 在VS集成环境中使用工具窗口