作者:朱金灿

来源: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 SDK\VisualStudioIntegration\Samples\IDE\Cpp目录下有一个叫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的插件,非常具有参考价值。

自己动手编写一个VS插件(六)的更多相关文章

  1. 自己动手编写一个VS插件(五)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...

  2. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  3. 自己动手编写一个VS插件(八)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 利用业余时间继续开发一个VS插件.我要开发的插件是一个代码库插件,主要是用于积累我平时要使用的代码.在之前我已经实现了 ...

  4. 自己动手编写一个VS插件(七)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...

  5. 如何自己编写一个easyui插件续

    接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来 ...

  6. 如何编写一个gulp插件

    很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方 ...

  7. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  8. 如何自己编写一个easyui插件

    本文介绍如何通过参考1.4.2版本的progressbar的源码自己编写一个HelloWorld级别的easyui插件,以及如何拓展插件的功能. 有利于我们理解easyui插件的实现,以及了解如何对e ...

  9. 自己动手编写Maven的插件

    Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要.本文参考官方文档后使用archetype创建,手动创建太麻烦. 创建创建项目 选择maven-archetype-moj ...

随机推荐

  1. [Angular2 Router] Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?

    In this tutorial we are going to learn how we can can configure redirects in the angular 2 router co ...

  2. Redis学习笔记--String(四)

    Redis的第一个数据类型string 1.命令 1.1赋值 语法:SET key value Set key value; > OK 1.2取值 语法:GET key > get tes ...

  3. 折叠table中的tr

    code <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. AE中Identify查询工具的实现

    原文 AE中Identify查询工具的实现 主要实现点击查询并闪烁显示,并把查询要素的信息通过DataGridView显示出来,主要用到的接口: IIdentity.IArray.IIdentifyO ...

  5. ios sqlite数据库操作

    @interface MyViewController () { // 数据库实例,代表着整个数据库 sqlite3 *_db; } @end @implementation MyViewContro ...

  6. log4cxx入门篇

    log4cxx入门篇     先看官网:http://logging.apache.org/log4cxx/index.html 转载自:http://wenku.baidu.com/view/d88 ...

  7. [React] Use React.cloneElement to Modify and Add Additional Properties to React Children

    In this lesson we'll show how to use React.cloneElement to add additional properties to the children ...

  8. GAN(Generative Adversarial Networks) 初步

    1. Generator vs. Discriminator 首先需要指出的是生成式模型(generative models)和判别式模型(discriminative models)的区别: dis ...

  9. java异常中Exception捕获不到的异常

    一 概念 众所周知java提供了丰富的异常类,这些异常类之间有严格的集成关系,分类为 父类Throwable Throwable的两个子类Error和Exception Exception的两个子类C ...

  10. ios开发网络学习AFN框架的使用一:get和post请求

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...