zoukankan      html  css  js  c++  java
  • 自己动手编写一个VS插件(六)

    作者:朱金灿

    来源:http://blog.csdn.net/clever101

     

            在上篇中我们已经实现了创建和显示一个工具栏出来,它的效果图是这样的:

                现在我们实现一些简单功能,具体就是单击按钮弹出一个模式对话框或非模式对话框。插件的命令消息响应函数是:

    	STDMETHOD(Exec)(BSTR CmdName, EnvDTE::vsCommandExecOption ExecuteOption, VARIANT *VariantIn, VARIANT *VariantOut, VARIANT_BOOL *Handled);

            这里的消息响应是采取字符串匹配的方式进行的,就是说VS中每一个按钮都有一个字符串ID,每个插件都执行Exec函数,当Exec函数的参数和CmdName相同时就响应该按钮。按钮的标识字符串有一定的规范,就是模块名. Connect.按钮名字,其中按钮名字由创建按钮函数AddNamedCommand2的第二个参数指定,比如DevAssist插件的一个按钮的标识是:DevAssist.Connect.StatCode。

     

    首先谈谈弹出一个模式对话框。弹出对话框一般有以下几种方式实现:

    1.      使用Windows API,具体参考petzold著的《Windows程序设计》,这里不作详述。

    2.      使用MFC。我不推荐这种方式,因为为弹出一个对话框动用一个庞大的MFC库实在是奢侈。

    3.      使用ATL,具体做法是添加一个ATL对话框,如下图:

         具体做法参考《ATL开发指南》。


            实际上弹出一个模式对话框是比较简单的,困难一点的是弹出一个非模式对话框。弹出一个非模式对话框有两种方式。第一种是使用VisualStudio2008SDK。下载安装后在MicrosoftVisual Studio 2008 SDKVisualStudioIntegrationSamplesIDECpp目录下有一个叫ToolWindow解决方案,它就是使用VisualStudio2008SDK实现弹出一个非模式对话框的例子。

     

    我不想用这种方法,因为有不安装VisualStudio2008SDK就能实现的方法。这种方法就是使用ATL控件。具体做法如下:

    1.      新建一个ATL项目,如下图:

    2.     选择类型为动态链接库,如下图:

    3.      添加一个ATL控件类,如下图:


    添加完成后工程会自动产生一个对话框资源,你可以在这个对话框上添加你想要的控件。查看TestAtlWin.rgs,记住我们添加的ATL控件类的ProgID是s TestAtlWin2.TestAtlDlg,待会我们会用到的。
    
    4.	现在回到我们的DevAssist工程,在CConnect类添加一个私有数据成员:
    

    CComPtr<EnvDTE::Window> m_pStatWin;

          然后在按钮消息响应部分添加如下代码:

               // 假如对话框窗口没创建出来,就执行创建
    			if(NULL==m_pStatWin)
    			{
    				CComPtr<EnvDTE::Windows> pWindows;
    				CComPtr<IDispatch> pProgrammableObject;
    				m_pDTE->get_Windows(&pWindows);
    
    				HRESULT hr = S_OK;
    				hr = pWindows->CreateToolWindow(m_pAddInInstance, CComBSTR("TestAtlWin2.TestAtlDlg"), CComBSTR("Tool"), CComBSTR("{9C62F52D-F3AB-45C4-9511-65FBA8AB3EBA}"), &pProgrammableObject, &m_pStatWin);
    				if(NULL!=m_pStatWin)
    					m_pStatWin->put_Visible(VARIANT_TRUE);
    			}
    			else
    			{
    				// 否则进行显示
    				m_pStatWin->put_Visible(VARIANT_TRUE);
    			}
    

    稍微解释下CreateToolWindow函数的用法,

    参数如下:

    AddInInst

        类型:EnvDTE.AddIn

        必需。一个 AddIn 对象,该对象的生存期确定工具窗口的生存期。

    ProgID

        类型:System.String

        必需。Document 对象或ActiveX 控件的编程 ID。

    Caption

        类型:System.String

        必需。新工具窗口的标题。

    GuidPosition

        类型:System.String

        必需。新工具窗口的唯一标识符,可用作 Item 的索引。这里一般传入控件的CLSID即可。

    DocObj

        类型:System.Object%

        必需。工具窗口中要承载的 Document 对象或控件。

     

           如果在新工具窗口可见之前尝试设置该工具窗口的任何可见状态(如高度、宽度或位置),则会发生错误。因此,在试图设置任何此类属性之前,请确保窗口是可见的。(资料来源:Windows.CreateToolWindow方法


    效果图如下:


            最后列出开发VS插件的一些资源链接:

     

    1.微软的关于VS扩展开发的论坛:VisualStudio Extensibility

     

    2. Visual Studio2005 Automation Samples,里面有很多很好的VS插件开发的例子,里面的CPPToolWindowControl例子颇具参考价值。

     

    3. VisualStudio 2008 Addin code samples,代码例子很多,但关于插件开发的一时没找着。

     

    4. gtestvsaddin,一个开源的在VS集成gtest的插件,非常具有参考价值。






























  • 相关阅读:
    java不定参数列表---乔老师没讲,但是传智有讲
    java数据库连接模板代码通用收集
    java数据库连接模板代码通用收集
    BZOJ2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛
    BZOJ1598: [Usaco2008 Mar]牛跑步
    BZOJ1710: [Usaco2007 Open]Cheappal 廉价回文
    manacher模板
    BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
    BZOJ1753: [Usaco2005 qua]Who's in the Middle
    BZOJ1828: [Usaco2010 Mar]balloc 农场分配
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470452.html
Copyright © 2011-2022 走看看