zoukankan      html  css  js  c++  java
  • 看图说话,编写VS2005插件,增强VS2005 IDE


     
    前几天写了个小插件,发了个bog,说要把过程写出来,今天来个看图说话吧。


     

    1、使用VS2005。创建新项目,选择Visual Studio 外接程序模版。

      1

    2、VS2005会启动外接程序向导

    2

    3、选择语言C#

    3

    4、选择应用主机

     4

    5、起个名字

     5

    6、选择界面,第一项打勾,向导会帮我们生成在“工具”菜单下增加我们自定义的子菜单的代码

     6

    7、关于对话框,要不要两可

     7

    8、到此完成

     8

    向导运行完毕,VS2005自动添加了一系列文件,最主要的就是Connect.cs,我们的自定义代码都要写在这个文件中。另外还有一个资源文件,在查找菜单项时使用,从而可以增加多语言支持。

     9

    下面是主要代码,请注意其中的黑体部分。

            public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
            {
                _applicationObject = (DTE2)application;
                _addInInstance = (AddIn)addInInst;
                if(connectMode == ext_ConnectMode.ext_cm_UISetup)
                {
                    object []contextGUIDS = new object[] { };
                    Commands2 commands = (Commands2)_applicationObject.Commands;
                    string toolsMenuName;

                    try
                    {
                        //若要将此命令移动到另一个菜单,则将“工具”一词更改为此菜单的英文版。
                        //  此代码将获取区域性,将其追加到菜单名中,然后将此命令添加到该菜单中。
                        //  您会在此文件中看到全部顶级菜单的列表
                        //  CommandBar.resx.
                        ResourceManager resourceManager = new ResourceManager("CodeFormater.CommandBar", Assembly.GetExecutingAssembly());
                        CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
                        //注意这里要做一下修改,VS2005向导生成的代码有点小问题
                        //这是根据CultureInfo在资源文件中查找"工具"菜单的名称.
                        //注意到CommandBar.resx资源文件中,我们采用的中文版vs2005,"工具"对应的名称是"zh-CHSTools"

                        10

                        string resourceName;
                        if (cultureInfo.TwoLetterISOLanguageName == "zh")
                        {
                            resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "-", cultureInfo.ThreeLetterWindowsLanguageName, "Tools");
                        }
                        else
                        {
                            resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
                        }
                        toolsMenuName = resourceManager.GetString(resourceName);

                    }
                    catch
                    {
                        //我们试图查找“工具”一词的本地化版本,但未能找到。
                        //  默认值为 en-US 单词,该值可能适用于当前区域性。
                        toolsMenuName = "Tools";
                    }

                    //将此命令置于“工具”菜单上。
                    //查找 MenuBar 命令栏,该命令栏是容纳所有主菜单项的顶级命令栏:
                    Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

                    //在 MenuBar 命令栏上查找“工具”命令栏:
                    CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
                    CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;

                    //如果希望添加多个由您的外接程序处理的命令,可以重复此 try/catch 块,
                    //  只需确保更新 QueryStatus/Exec 方法,使其包含新的命令名。
                    try
                    {
                        //将一个命令添加到 Commands 集合:
                        Command command = commands.AddNamedCommand2(_addInInstance, "CodeFormater", "CodeFormater", "格式化选中代码的格式", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

                        //将对应于该命令的控件添加到“工具”菜单:
                        if((command != null) && (toolsPopup != null))
                        {
                            command.AddControl(toolsPopup.CommandBar, 1);
                        }
                    }
                    catch(System.ArgumentException)
                    {
                        //如果出现此异常,原因很可能是由于具有该名称的命令
                        //  已存在。如果确实如此,则无需重新创建此命令,并且
                        //  可以放心忽略此异常。
                    }
                }
            }

     

     

     

            /// <summary>实现 IDTCommandTarget 接口的 Exec 方法。此方法在调用该命令时调用。</summary>
            /// <param term='commandName'>要执行的命令的名称。</param>
            /// <param term='executeOption'>描述该命令应如何运行。</param>
            /// <param term='varIn'>从调用方传递到命令处理程序的参数。</param>
            /// <param term='varOut'>从命令处理程序传递到调用方的参数。</param>
            /// <param term='handled'>通知调用方此命令是否已被处理。</param>
            /// <seealso class='Exec' />
            public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
            {
                handled = false;
                if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
                {
                    if (commandName == "CodeFormater.Connect.CodeFormater")
                    {

                        //在这里就可以实现自己的逻辑来扩展VS2005的功能了,这里我自己写了个很简单的类,来帮我处理代码对齐功能
                       
                        string selectedCode = ((TextSelection)_applicationObject.ActiveDocument.Selection).Text;
                        string outCode = CodeSmart.AlignText(selectedCode, "=");            //对齐选中文本中的"="
                        outCode = CodeSmart.AlignText(outCode, "//");                              //对齐选中文本中的"//"
                        ((TextSelection)_applicationObject.ActiveDocument.Selection).Insert(outCode, (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);


                        handled = true;
                        return;
                    }
                }
            }

    编译,运行,你就会看到一个新的VS2005启动了,工具菜单下多了一个CodeFormate菜单,就这样,一个简单的VS2005插件就做好了。过程是这样,你还可以编写其他的逻辑来实现你自己想要的功能。

    源代码下载:

    CodeFormater_src.rar 45KB 0 2008/4/9 21:26:03 Download

    插件下载:

    CodeFormater.zip 10KB 154 2008/4/7 20:48:19 Download

    作者:峻祁连
    邮箱:junqilian@163.com
    出处:http://junqilian.cnblogs.com
    转载请保留此信息。
  • 相关阅读:
    2.5 整数和算法
    斑马问题
    计算机硬件操作
    幸福是什么
    英译汉技巧
    指令
    计算机性能
    硬盘容量的计算方法
    Symmetric Tree
    Same Tree
  • 原文地址:https://www.cnblogs.com/junqilian/p/1145733.html
Copyright © 2011-2022 走看看