作者:朱金灿

来源: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的插件,非常具有参考价值。

最新文章

  1. 百度地图api的覆盖物样式与bootstrap样式冲突解决办法
  2. 关于eclipse的一些配置
  3. js图形网站
  4. 解决Eclipse报errors running builder ‘javascript validator’ on project
  5. ftp自动上传下载文件脚本
  6. Linux美化——终端提示符
  7. vb delphi7、2010 csharp vb.net空白测试程序
  8. linux环境变量入门
  9. android v4兼容包
  10. 树状数组-HDU1541-Stars一维树状数组 POJ1195-Mobile phones-二维树状数组
  11. abp中文件下载,将内存数据导出到Excel并下载
  12. django模版中配置和使用静态文件方法
  13. [自用]多项式类数学相关(定理&amp;证明&amp;板子)
  14. 启动Docker容器
  15. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
  16. pygame 游戏舞台搭建典型应用
  17. 基于STM32L4的开源NBIOT开发资料
  18. VS2010显示行号
  19. Java快速开发平台,JEECG 3.7.6性能增强版本发布
  20. 从 SVM 到多核学习 MKL

热门文章

  1. HDU - 3341 Lost&amp;#39;s revenge(AC自己主动机+DP)
  2. 9.2 Binder系统_驱动情景分析_服务注册过程
  3. libSVM介绍(二)
  4. PHP解决约瑟夫环问题
  5. matplotlib 可视化 —— style sheets
  6. redis学习笔记之虚拟内存
  7. 洛谷 P4013 数字梯形问题
  8. MS SQL Server的STRING_SPLIT和STRING_AGG函数
  9. js进阶正则表达式8量词(+*?{}的意义用法)(量词的对象是前面一个字符)
  10. Android菜鸟的成长笔记(27)——SurfaceView的使用