摩诘

我思故我在 常辨而常新

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  20 随笔 :: 2 文章 :: 345 评论 :: 11 引用

前面一篇文章写了如何操作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集成环境中使用工具窗口 
 


VS.NET 2003集成环境插件开发指南(一)----操纵菜单

       VS.NET 2003集成环境插件开发指南(三)----操纵VS开发环境(完结篇)

posted on 2005-03-29 09:32 sema 阅读(5702) 评论(15)  编辑 收藏 网摘 所属分类: 技术研究

评论

#1楼  2005-03-29 13:15 fking [未注册用户]
这个应该加精。
  回复  引用    

绝对收藏,这个部分是我一直没有弄通得,强烈顶!
  回复  引用    

#3楼  2005-09-02 10:58 test [未注册用户]
如何来调试vs.net的插件
  回复  引用    

#4楼  2005-09-02 14:01 test [未注册用户]
大虾你的MenuBrowser /Connect.cs文件的代码好像有问题,每次执行到

windowExplorer = applicationObject.Windows.CreateToolWindow(addInInstance,"VSUserControlHost.VSUserControlHostCtl","菜单浏览器",guidstr,ref objTemp); 这里的时候会有异常抛出。

小弟实在是不知道如何解决,恳请帮忙!!!谢谢!!!
  回复  引用    

#5楼 [楼主] 2005-09-03 11:41 sema      
@Test
1、VSUserControlHost.dll放在\Libs目录下面,你需要在引用程序集里面重新更新一下该链接
2、引起的异常可能是因为你用的VS.NET是英文版本的,它在找菜单项的时候,是根据菜单的显示名字来查找的。所以英文版本的VS.NET的菜单名应该是英文。我的代码里只针对中文版本写的,你可以自行改正。
3、调试的方法是,先编译插件的安装程序MenuBrowserSetup,然后右键点击该工程,在快捷菜单里选择Install(安装),安装好插件后,你将插件程序MenuBrowser设置为启动程序,然后启动调试,就会有另外一个VS.NET的实例启动。你就可以一步一步调试了。如果你改动了代码,或者是有些时候发现调试不正常,请卸载插件后再从新安装,有时候需要从启VS.NET。

因为最近很忙,所以不能写的更详细。请见谅!
  回复  引用  查看    

#6楼  2005-09-05 15:39 test [未注册用户]
sema:

我的VS.NET是中文版的,我将代码改成
windowExplorer = applicationObject.Windows.CreateToolWindow(addInInstance,"VSUserControlHost.VSUserControlHostCtl","MenuBrowser",guidstr,ref objTemp);
还是有异常抛出。

恳请老大帮忙!!谢谢!!!
  回复  引用    

#7楼 [楼主] 2005-09-05 20:35 sema      
你用try, catch捕获一下异常,看看异常信息是什么。
  回复  引用  查看    

#8楼  2005-09-06 12:04 test [未注册用户]
异常信息是:“无效的类别字符串”,会不会是这个的问题“VSUserControlHost.VSUserControlHostCtl”,我在引用VSUserControlHost.dll的时候,vs.net里显示的名称是:VSUserControlHostLib。不知道是不是VSUserControlHost.dll的问题。你的VSUserControlHost.dll是从哪里得到的?


恳请帮忙!!!!谢谢!!!!
  回复  引用    

#9楼  2005-10-22 16:37 EasyOne [未注册用户]
大虾 我也遇到 sema出现的这个问题。我估计是 VSUserControlHost的版本不对。你用的是那个版本啊!能不能给我一份,万分感谢啊!
这是我的邮箱,能不能给我一份啊!

easyone_zy@yahoo.com.cn
  回复  引用    

#10楼  2006-01-04 16:59 Rainbow [未注册用户]
我在CreateToolWindow的时候也遇到过同样的问题,异常信息是:“无效的类别字符串”。不知道是什么原因,我们这里是有的机子上能正常运行,好多都会出现这种异常。谁有办法解决呀,谢谢了!!
  回复  引用    

怎么生成了,没有错,但是就是不显示Tool Window,为什么啊?
  回复  引用    

#12楼  2006-07-17 15:09 songsu [未注册用户]
//用容器对象包含用户控件,

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

"MenuBrowser.MenuExplore");

//设置窗口的图标

//windowExplorer.SetTabPicture(…)

//将DTE对象赋给窗口

menuExplorer.Application = applicationObject;

老大。这两句看不懂,

menuExplorer 这是一个什么类型的对象啊?

MenuExplore 是用户控件的话,好像没有Application 这个属性
  回复  引用    

#13楼  2006-07-17 16:34 songsu [未注册用户]
唉,搞了一天,终于搞定了。。。

原来是MenuExplore用户控件里面的一个变量,这个变量是自定义的
  回复  引用    

#14楼  2006-07-20 00:28 songsu [未注册用户]
关于 “无效的类别字符串 ”错误的解决方法
先注册VSUserControlHost.dll 这个组件
  回复  引用    

#15楼 [楼主] 2006-08-11 22:34 sema      
@songsu,
谢谢你和大家分享你的心得!


  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-04-01 14:42 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索

相关链接: