带有停靠窗口的Visual Studio扩展

时间:2011-04-22 16:15:10

标签: visual-studio-2010 add-in

Newbie Visual Studio扩展问题:我想创建一个扩展来监视击键并将统计信息报告给可停靠窗口(“可停靠”,如解决方案资源管理器或属性窗口)。我在查找编辑器中提供的不仅仅是语法高亮的好教程时遇到了麻烦。

这是否可以作为扩展?或者我是否需要创建加载项?我最感兴趣的课程是完成这些高级任务?

1 个答案:

答案 0 :(得分:2)

您将能够通过Visual Studio加载项轻松实现您的想法。如果要创建VS样式ToolWindow,请按照下面的步骤操作。在示例中,VS ToolWindow承载TreeView,但您可以使用您选择的控件。我更喜欢C ++ CLI,但通常下面的步骤对C#或VB.Net也应该有效。

  1. 通过 File-> New-> Project-> OtherProjectTypes-> Extensibility-> VS Add-In
  2. 创建新的加载项
  3. 将以下内容实施到加载项类

    public ref class Connect : public IDTExtensibility2, public IDTCommandTarget
    {
    public:
    ...
    private:
       literal String^ VSToolWinGuid = "{6CCD0EE9-20DB-4636-9149-665A958D8A9A}";
    
       DTE2^ appObject;    // object which lets us access the IDE
       AddIn^ addInInstance;   // the AddIn object itself
       Window^ MainWindow;     // VS style tool Window
       TreeView^ FormTreeView; 
    
       // Instance of the Add-In button located in the VS IDE Toolbar
       CommandBarButton^ StdCommandBarButton;  
    
       void InitializeToolBarButton(); // Creates a button on the Standard Toolbar
       void ShowAddInWindow();     // Creates and displays the Tool Window
    ...
    };
    
    
    
    void Connect::OnConnection(...)
    {
       appObject = dynamic_cast<DTE2^>(Application);
       addInInstance = dynamic_cast<AddIn^>(AddInInst);
    
       // Initialize the add-in when VS is setting up it's user interface
       if (ext_ConnectMode::ext_cm_UISetup==ConnectMode)
          InitializeToolBarButton();
    }
    
    
    void Connect::Exec(...)
    {
       handled = false;
       if (vsCommandExecOption::vsCommandExecOptionDoDefault == ExecuteOption)
       {
          // when the ToolBar Button is clicked through the UI
          if (!CmdName->CompareTo("FormBrowserAddIn.Connect.FormBrowser"))
          {             
             ShowAddInWindow();
             handled = true;
             return;
          }
       }
    }
    
    
    void Connect::InitializeToolBarButton()
    {
       try
       {    
          Command^ command = nullptr;           
          try
          {  // obtain the command if it is already created         
             command = appObject->Commands->Item(addInInstance->ProgID + "." + AddInName, -1);
          }
          catch(Exception^){}
    
          // create the command if does not exists
          if (nullptr == command)
          {
             // it is better to use the newest Commands2, because it allows to create
             // the ToolBar button with the style definition at once
             EnvDTE80::Commands2^ commands2 = safe_cast<EnvDTE80::Commands2^>(appObject->Commands);
    
             // optional, determines which environment contexts (debug mode, design mode, ...) show the command
             Array^ contextGUIDs = Array::CreateInstance(Object::typeid, 0);                
    
             // create the ToolBar button for our Add-In
             command = commands2->AddNamedCommand2(addInInstance, 
                  AddInName, AddInCaption, AddInToolTip, true, 59, contextGUIDs,
                 (int)(vsCommandStatus::vsCommandStatusSupported | vsCommandStatus::vsCommandStatusEnabled),
                 (int)vsCommandStyle::vsCommandStylePict, vsCommandControlType::vsCommandControlTypeButton);
           }
    
           // Obtain the Standard command bar and insert our ToolBar button there
           VisualStudio::CommandBars::CommandBars^ commandBars;
           commandBars = (VisualStudio::CommandBars::CommandBars^)appObject->CommandBars;
           CommandBar^ stdCommandBar = commandBars["Standard"];
           StdCommandBarButton = (CommandBarButton^)command->AddControl(stdCommandBar, stdCommandBar->Controls->Count+1);
        }
        catch(Exception^ e)
        {
            MessageBox::Show(e->ToString());
        }
    }
    
    
    void Connect::ShowAddInWindow()
    {
       try
       {
          if (nullptr == MainWindow)
          {
             // obtain the assembly of the TreeView
             String^ TreeViewFullName = "System.Windows.Forms.TreeView";
             String^ assembly = Reflection::Assembly::GetAssembly(System::Windows::Forms::TreeView::typeid)->Location;
    
             // create the VS style Tool Window
             Object^ UserCtrlObject = nullptr;
             EnvDTE80::Windows2^ win = (EnvDTE80::Windows2^)appObject->Windows;
             MainWindow = win->CreateToolWindow2(addInInstance, assembly, TreeViewFullName, AddInCaption, VSToolWindowGuid, UserCtrlObject);
    
             // set-up the tree view
             FormTreeView = (TreeView^)UserCtrlObject;      
          }
    
          // refresh the content and make the add-in visible
          RefreshTreeView();
          MainWindow->Visible = true;
       }
       catch (Exception^ e)
       {
          MessageBox::Show(e->ToString());
       }
    }
    
  4. 我从未尝试过处理加载项中的关键事件,但我希望您能找到答案here

    无论如何,你可以找到很多好的教程here或者搜索MZTools。