作者:朱金灿

来源: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. js进阶 12-15 jquery如何实现点击button显示列表,点击其它位置隐藏列表

    js进阶 12-15 jquery如何实现点击button显示列表,点击其它位置隐藏列表 一.总结 一句话总结:在button中阻止事件冒泡. 1.如何咋button中阻止事件冒泡(两种方法)? ev ...

  2. ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件

    ORACLE RMAN备份及还原   RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...

  3. php中的转义字符(用反斜杠\来输出,和C语言一样)

    php中的转义字符(用反斜杠\来输出,和C语言一样) 一.总结 1.引号中的变量:双引号会替换变量的值,而单引号会把它当做字符串输出. 2.引号中的转义字符:双引号将用变量的值(test)代替它的名称 ...

  4. POJ 2363 Blocks (ZOJ 1910) 数学

    杨宗纬的歌"这一路走来" 还蛮好听的,这首歌静静的躺在我的音乐盒某个阴暗的角落里,今天随机播放才发现的,哈哈. 数学一直是硬伤...... -------------------- ...

  5. [Node] Using dotenv to config env variables

    Install: npm install dotenv --save For example, we can store the sensitive information or env relate ...

  6. 简要分析武汉一起好P2P平台的核心功能

    写作背景 加入武汉一起好,正式工作40天了,对公司的核心业务有了更多的了解,想梳理下自己对于P2P平台的认识. 武汉一起好,自己运营的yiqihao.com,是用PHP实现的,同时也帮助若干P2P平台 ...

  7. Oracle 12C R2 on Linux 7.X 单实例静默安装文档

    禁用防火墙systemctl stop firewalld.servicesystemctl disable firewalld.service 禁用SELinuxcat /etc/selinux/c ...

  8. chrome-vimium在markdown插件的页面失去效果

    chrome-vimium在markdown插件的页面失去效果

  9. UTC时间与当地时间的转换关系?

    UTC时间与当地时间转换关系? 一.总结 1.UTC +时区差=本地时间 2.UTC是世界统一时间 二.UTC时间是什么 1.UTC时间 协调世界时,又称世界统一时间.世界标准时间.国际协调时间.由于 ...

  10. [Vue] Get up and running with vue-router

    How do we set up a simple app with its own routes with their own components in Vue? Install: npm i - ...