作者:朱金灿

来源: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. [React Intl] Render Content with Markup Using react-intl FormattedHTMLMessage

    In this lesson, we’ll use the react-intl FormattedHTMLMessage component to display text with dynamic ...

  2. WSL(Windows上的Linux子系统)

    WSL(Windows上的Linux子系统) WSL,Windows Subsystem for Linux,就是之前的Bash on [Ubuntu on] Windows(嗯,微软改名部KPI++ ...

  3. VSX(翻译)Moving Code Blocks Among Code Regions using VS 2010 Extensions

    Moving Code Blocks Among Code Regions using VS 2010 Extensions (翻译)使用VS 2010 扩展性将代码块移至Region区域中 Down ...

  4. [CSS3] Create a fixed-fluid-fixed layout using CSS calc()

    CSS calc() allows you to mix and match units to get real-time calculations. It's useful when you nee ...

  5. ZOJ-1649 Rescue BFS (HDU 1242)

    看题传送门: ZOJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 HDU http://acm.hdu.edu. ...

  6. POJ 3641 Oulipo KMP 水题

    http://poj.org/problem?id=3461 直接KMP就好.水题 #include<cstdio> #include<cstring> const int M ...

  7. mha && 脚本拉起

    ip分布:  vip 192.168.238.222 mha_manager 192.168.238.131 监控服务器 master 192.168.238.128 主库GTID复制模式 slave ...

  8. solr源码导入eclipse 分类: H4_SOLR/LUCENCE 2014-07-14 14:11 550人阅读 评论(1) 收藏

    转载自:http://blog.csdn.net/vltic/article/details/19917377 (1)相应的开发环境准备          (1)jdk1.6+的安装和环境变量配置(命 ...

  9. android,安卓get请求的提交以及我遇到的异常

    首先说明 我是安卓4.0以上的版本,这个时候直接用网上的代码会报错的,先赋上网上的普遍代码 String uri = "http://url"; HttpGet httpGet = ...

  10. Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...