2011-04-22 9 views
5

Pregunta de extensión de Newbie Visual Studio: me gustaría crear una extensión que supervisa las pulsaciones de teclas e informes de estadísticas en una ventana acoplable ("acoplable" como el explorador de soluciones o ventanas de propiedades). Tengo problemas para encontrar buenos tutoriales que ofrezcan algo más que resaltar la sintaxis en el editor.Extensión de Visual Studio con ventana de acoplamiento

¿Es todo esto factible como una extensión? ¿O necesito crear un complemento? ¿En qué clases me interesaría más realizar estas tareas de alto nivel?

Respuesta

2

Podrá implementar sus ideas fácilmente a través de un complemento de Visual Studio. Si desea crear VS ToolWindow de estilo, entonces siga los pasos a continuación. En el ejemplo, VS ToolWindow alberga un TreeView, pero puede usar un control de su elección. Prefiero la CLI de C++, pero generalmente los pasos a continuación deberían ser válidos también para C# o VB.Net.

  1. Crear un nuevo complemento mediante Archivo-> Nuevo-> Proyecto-> OtherProjectTypes-> Extensibility-> VS Add-In
  2. implementar lo siguiente en su clase de complementos

    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()); 
        } 
    } 
    

que nunca han tratado de controlar los eventos clave de un complemento, pero espero que usted puede encontrar las respuestas here.

De todos modos, puedes encontrar muchos buenos tutoriales here o buscar MZTools.

Cuestiones relacionadas