学习制作VS2005 Addins-添加工具栏按钮(转)

这几天项目暂时松下来了,下一个项目暂时也不用我操心,于是乎想重新整理前段时间准备一个小型ERP项目的技术架构时写的一个代码生成模板,写着写着就觉得将代码生成模板交给所有组员是不合适的,即使是把生成模板部分写成vs2005代码再生成动态库联合MyGeneration一起使用也不方便,一是每人都必须装MyGeneration,二是在开发和生成代码的时候难免要不停的切换窗口,太麻烦了,因此动了写一个代码生成器插件的念头,当然仅仅是我们自己适合用,给别人不一定用的上;

      但是本人从来没写过插件,没有一点感觉,上网google一下发现如下资源:

  1. Visual Studio 2005 插件编程(代码行数统计插件)
  2. 用Visual Studio 2005 开发VB.NET-C#语言转换插件
  3. VS 2005 Add-in开发随笔 以及Explorer - A Visual Studio 2005 add-in which interacts with Windows Explorer
  4. 还有MysticBoy这位老兄,但是全是vb的,本人不懂vb

     上面这些资源确实不错,至少带我入门了,谢谢上面资料的作者,但是仅仅通过这些资源要想写一个复杂的插件也是不容易的首先我就没找到要在标准工具栏上加一个自己的按钮,并在点击时执行对应的命令,在仔细学习了上面的资料后也是找不到头绪,查msdn也没详细的解释,于是就开始试,试着试着就有点意思了;

其实很简单,一下是简单步骤:

  1. 使用工程向导先建立工程,至于怎么建就可以看上面的资料了,这里忽略;
  2. 清除类Connect.cs方法OnConnection原有的代码,并加入如下代码
     _applicationObject = (DTE2)application;
                _addInInstance 
    = (AddIn)addInInst;
                CommandBars cmdBars 
    = (CommandBars)(_applicationObject.DTE.CommandBars);

                
    if (connectMode == ext_ConnectMode.ext_cm_Startup)
                {
                    Commands2 commands 
    = ((Commands2)(_applicationObject.Commands));
                    CommandBar standardBarToolbar 
    = cmdBars["Standard"];

                    
    object[] contextGUIDS = new object[] { };
                    
    try
                    {
                        Command btnCommandFromTarget 
    = commands.AddNamedCommand2(_addInInstance, 
                                    
    "MyTest""TestText"
                                    
    "TestTip"true41,
                                    
    ref contextGUIDS,
                                    ((
    int)(vsCommandStatus.vsCommandStatusSupported)) +
                                    ((
    int)(vsCommandStatus.vsCommandStatusEnabled)),
                                    ((
    int)(vsCommandStyle.vsCommandStylePictAndText)),
                                    vsCommandControlType.vsCommandControlTypeButton);

                        btnCommandFromTarget.AddControl(standardBarToolbar, 
                                            standardBarToolbar.Controls.Count 
    + 1);
                    }
                    
    catch (Exception e)
                    {
                        global::System.Windows.Forms.MessageBox.Show(e.Message);
                    }
                }
  3. 在OnDisconnection方法中加入,注意这句代码很危险,在正式写插件的时候要好好考虑
     standardBarToolbar.Controls[standardBarToolbar.Controls.Count].Delete(null);
  4. 在QueryStatus中用下面的代码替换原有代码,其实就改了"MyAddin2.Connect.MyTest"
    if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
       {
          
    if (commandName == "MyAddin2.Connect.MyTest")
          {
                              status 
    = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|
    vsCommandStatus.vsCommandStatusEnabled;
             
    return;
           }
       }
  5. 实现Exec就ok了,用下面的代码替换原有代码,也就是改了"MyAddin2.Connect.MyTest"加了一个命令处理过程,这里仅仅是一个box框
    handled = false;
    if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    {
      
    if (commandName == "MyAddin2.Connect.MyTest")
       {
           System.Windows.Forms.MessageBox.Show(
    "点击了测试按钮!");
           handled 
    = true;
          
    return;
       }
    }
  6. 运行,看效果
     是不是很简单?没有技术含量但是就是cmdBars["Standard"]就折腾我不短时间,Standard这个不支持中文,一气之下把所有的都跟踪出来了放在这里备忘,也便于大家查;

    另外,顺便问个很土的问题:下图框住的文件手工如何加上去?以前加过现在忘了,莫非还要手工改工程文件代码?请知道的告之,谢谢
                  

posted on 2012-08-21 16:03  carekee  阅读(608)  评论(0编辑  收藏  举报