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

推荐订阅源

A
Arctic Wolf
U
Unit 42
爱范儿
爱范儿
WordPress大学
WordPress大学
博客园 - 司徒正美
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
美团技术团队
博客园_首页
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
H
Hacker News: Front Page
博客园 - 叶小钗
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
罗磊的独立博客
TaoSecurity Blog
TaoSecurity Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Help Net Security
Help Net Security
雷峰网
雷峰网
S
Security @ Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
T
Troy Hunt's Blog
V
V2EX
博客园 - 聂微东
Cloudbric
Cloudbric
大猫的无限游戏
大猫的无限游戏
Google Online Security Blog
Google Online Security Blog
S
Security Affairs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Commits to openclaw:main
Recent Commits to openclaw:main
IT之家
IT之家
S
SegmentFault 最新的问题
T
Threat Research - Cisco Blogs
J
Java Code Geeks
H
Heimdal Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
The Cloudflare Blog
Simon Willison's Weblog
Simon Willison's Weblog
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 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集成环境中使用工具窗口