2011-08-18 35 views
1

我正在嘗試爲「項目和解決方案上下文菜單>解決方案」菜單創建附加菜單項。不過,我希望這個上下文菜單隻在打開某個解決方案時出現,否則我不希望它顯示。我想我可以在Visual Studio IDE中使用MACROS。有些事件在開放的解決方案&項目上運行等我可以通過編程修改IDE的上下文菜單嗎?

我的問題是,我可以創建上下文菜單我想編程方式,將其指向我希望它運行的MACRO,然後以編程方式將它附加到IDE中的CONTEXT菜單,我想要顯示它?

回答

0

我找到了我的問題的答案。我用下面的代碼來創建我需要的菜單項:

Private WithEvents _objSolutionExplorer_ContextMenu_ItemHandler As EnvDTE.CommandBarEvents 
Private _objHash_ContextMenuItemHandlers As New Hashtable 

Private Function CreateContextMenuButtonItem(ByVal p_objMenuItem As Object, ByVal p_strMenuItemCaption As String) As CommandBarButton 
    '************************************************************************ 
    ' Procedure/Function: CreateContextMenuButtonItem() 
    ' Author: Ben Santiago 
    ' Created On: 08/18/2011 
    ' Description: 
    '  Creates specified MenuButton item. 
    '************************************************************************ 

    '*************************************** 
    ' Initialize Variables 
    '*************************************** 
    Dim objMenuButton As CommandBarButton 
    Dim objClickEventHandler As EnvDTE.CommandBarEvents 

    '*************************************** 
    ' If MenuItem Exists, Delete It 
    '*************************************** 
    For intCounter As Integer = 1 To p_objMenuItem.Controls.Count 
     If p_objMenuItem.Controls.Item(intCounter).Caption = p_strMenuItemCaption Then 
      p_objMenuItem.Controls.Item(intCounter).Delete() 
      Exit For 
     End If 
    Next 
    If EnvironmentEvents._objHash_ContextMenuItemHandlers.Contains(p_strMenuItemCaption) Then 
     EnvironmentEvents._objHash_ContextMenuItemHandlers.Remove(p_strMenuItemCaption) 
    End If 

    '*************************************** 
    ' Create New Menu Item w/ Click Event Handling 
    '*************************************** 
    objNewMenuItem = p_objMenuItem.Controls.Add(MsoControlType.msoControlButton, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, True) 
    objNewMenuItem.Caption = p_strMenuItemCaption 
    objClickEventHandler = DTE.Events.CommandBarEvents(objNewMenuItem) 
    AddHandler objClickEventHandler.Click, AddressOf TestScoring_objSolutionExplorer_ContextMenu_ItemHandler_Click 
    If EnvironmentEvents._objHash_ContextMenuItemHandlers.Contains(p_strMenuItemCaption) Then 
     EnvironmentEvents._objHash_ContextMenuItemHandlers.Remove(p_strMenuItemCaption) 
    End If 
    EnvironmentEvents._objHash_ContextMenuItemHandlers.Add(p_strMenuItemCaption, objClickEventHandler) 

    '*************************************** 
    ' Return Reference To MenuButton Item 
    '*************************************** 
    Return objNewMenuItem 
End Function 

Private Function CreateContextMenuPopupItem(ByVal p_strCommandBarName As String, ByVal p_strMenuCaption As String) As CommandBarPopup 
    '************************************************************************ 
    ' Procedure/Function: CreateContextMenuPopupItem() 
    ' Author: Ben Santiago 
    ' Created On: 08/18/2011 
    ' Description: 
    '  Creates specified MenuPopup item. 
    '************************************************************************ 

    '*************************************** 
    ' Initialize Variables 
    '*************************************** 
    Dim objCommandBar As CommandBar = DTE.CommandBars(p_strCommandBarName) 
    Dim objMenuPopup As CommandBarPopup 

    '*************************************** 
    ' Search For Existing ContextMenuPopup 
    '*************************************** 
    For intCounter As Integer = 1 To objCommandBar.Controls.Count 
     If objCommandBar.Controls.Item(intCounter).Caption = p_strMenuCaption Then 
      objMenuPopup = objCommandBar.Controls.Item(intCounter) 
      Exit For 
     End If 
    Next 

    If objMenuPopup Is Nothing Then 
     '*************************************** 
     ' Create Menu If Needed 
     '*************************************** 
     objMenuPopup = objCommandBar.Controls.Add(MsoControlType.msoControlPopup, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, True) 
     objMenuPopup.Caption = p_strMenuCaption 
    Else 
     '*************************************** 
     ' Delete All Child Menu Items 
     '*************************************** 
     For intCounter As Integer = objMenuPopup.Controls.Count To 1 Step -1 
      If EnvironmentEvents._objHash_ContextMenuItemHandlers.Contains(objMenuPopup.Controls.Item(intCounter).Caption) Then 
       EnvironmentEvents._objHash_ContextMenuItemHandlers.Remove(objMenuPopup.Controls.Item(intCounter).Caption) 
      End If 
      objMenuPopup.Controls.Item(intCounter).Delete() 
     Next 
    End If 

    '*************************************** 
    ' Return Reference To MenuPopup Item 
    '*************************************** 
    Return objMenuPopup 
End Function 
0

您可以使用DTE.ExecuteCommand()來執行其他宏。

2

我發現this link非常有用

裏面的OnConnection方法,我有這樣的:

CommandBars cmdBars = (CommandBars)applicationObject.CommandBars; 
     CommandBar codeWindowCmdBar = cmdBars["Code Window"]; 

     CommandBarPopup doxygenPopup = (CommandBarPopup)codeWindowCmdBar.Controls.Add(MsoControlType.msoControlPopup, 
            System.Reflection.Missing.Value, 
            System.Reflection.Missing.Value, 
            1, 
            true); 
     doxygenPopup.Caption = "Doxygen Commenting"; 


     CommandBarControl mnuListItem = (CommandBarControl)doxygenPopup.Controls.Add(MsoControlType.msoControlButton, 
      System.Reflection.Missing.Value, 
      System.Reflection.Missing.Value, 
      1, 
      true); 

     mnuListItem.Caption = "Wrap as List Item"; 
     mnuListItemHandler = (CommandBarEvents) applicationObject.Events.get_CommandBarEvents(mnuListItem); 
     mnuListItemHandler.Click += mnuListItemHandler_Click; 

     CommandBarControl mnuUnorderedList = (CommandBarControl)doxygenPopup.Controls.Add(MsoControlType.msoControlButton, 
      System.Reflection.Missing.Value, 
      System.Reflection.Missing.Value, 
      2, 
      true); 

     mnuUnorderedList.Caption = "Wrap as Unordered List"; 
     mnuUnorderedListHandler = (CommandBarEvents)applicationObject.Events.get_CommandBarEvents(mnuListItem); 
     mnuUnorderedListHandler.Click += mnuUnorderedListHandler_Click; 

     CommandBarControl mnuOrderedList = (CommandBarControl)doxygenPopup.Controls.Add(MsoControlType.msoControlButton, 
      System.Reflection.Missing.Value, 
      System.Reflection.Missing.Value, 
      2, 
      true); 

     mnuOrderedList.Caption = "Wrap as Ordered List"; 
     mnuOrderedListHandler = (CommandBarEvents)applicationObject.Events.get_CommandBarEvents(mnuListItem); 
     mnuOrderedListHandler.Click += mnuOrderedListHandler_Click; 

click事件處理程序我做任何需要的內部。

請注意,這是一個包含子項目的主菜單項。對於只有一個項目,請查看this video。這傢伙一步一步地走了......做得很好。

相關問題