2017-03-03 13 views
0

這與this question密切相關,該窗口未發佈答案。僅在特定窗體控件(文本框)上啓用快捷菜單

我有一個窗體,我希望只有在該窗體上的文本框內單擊時才啓用快捷菜單(右鍵彈出的窗口)(禁用其他任何地方)。問題是,看起來這個選項只對整個表單是全局的。

將Form的ShortcutMenu設置爲False後,我可以使用「ShortcutMenu = True」在TextBox的「On Enter」事件中將其設置爲True,從而在輸入TextBox之前不進行任何操作。問題在於,當用戶輸入文本框時,如果他右鍵單擊窗體中的任何其他位置,右鍵菜單將出現,這不是我想要的。

在同一文本框的作品的「退出」事件,但僅當另一個控制用戶點擊,而不是之前使用「ShortcutMenu =假」,不解決這個問題禁用ShortcutMenu。

反正有人在執行某個地方的右鍵單擊動作之前運行「ShortcutMenu = False」嗎? (進入文本框後)。像「鼠標離開這個控制」事件?

+0

不確定,但是您可以使用Form'MouseMove'事件來確定是否在該框中,或者可能是MouseDown事件或GotFocus事件? –

+0

在文本框上使用GotFocus會產生類似的行爲,以啓用快捷菜單到我上面使用的內容。我可以看到MouseMove正在工作,但我必須知道TextBox Twip中的確切位置,所以我可以這樣做「如果指針位於外框位置,那麼......」但我不夠精通。此外,這將繼續執行「ShortcutMenu = False」,它會使表單內容閃爍。 – Cinetyk

+1

每英寸約有1440緹。因此,您可以立即檢查If X> = Me.txtA,Left * 1440和X <=(Me.txtLeft + Me.txtA.Width)* 1440並且Y> = Me.txtA.Top * 1440且Y <=(Me .txtA.top + me.txtA.Height)* 1440 Then ... else exit ...(不記得X和Y或Y和X) –

回答

1

您可以通過在運行中創建2個自定義快捷菜單來完成此任務。一個基本上是整個表單的虛擬快捷菜單,沒有控制,另一個將是你想要在你的實際控制中出現的菜單。我有這些設置爲臨時。您需要將自定義控件調整爲右鍵單擊時要顯示的內容。

Private Const CntrlShortcutMenu As String = "CntrlShortCutMenu" 
Private Const FormShortcutMenu As String = "FormShortCutMenu" 

Private Sub Form_Load() 
Call CreateControlShortcutMenu("txtvalue1") 
Call CreateDummyShortcutMenuonForm 
End Sub 

Private Sub Form_Unload(Cancel As Integer) 
DeleteShortCutMenu (CntrlShortcutMenu) 
DeleteShortCutMenu (FormShortcutMenu) 
End Sub 

Private Sub CreateDummyShortcutMenuonForm() 
    Call DeleteShortCutMenu(FormShortcutMenu) 
    Call CommandBars.Add(FormShortcutMenu, 5, False, True) 
    Me.ShortcutMenuBar = FormShortcutMenu 
End Sub 

Private Sub DeleteShortCutMenu(MenuName As String) 
    On Error Resume Next 
    CommandBars(MenuName).Delete 
End Sub 

Private Sub CreateControlShortcutMenu(CntrlName As String) 

On Error GoTo errhandler 

    Dim cmdShortcutMenu As Object 'Office.CommandBar 

    Call DeleteShortCutMenu(CntrlShortcutMenu) 

    Set cmdShortcutMenu = CommandBars.Add(CntrlShortcutMenu, 5, False, True) 

     With cmdShortcutMenu 

      With .Controls.Add(Type:=10) 
       .Caption = "Text Editing" 
       .Controls.Add Type:=1, Id:=19 'Copy 
       .Controls.Add Type:=1, Id:=22 'Paste 
       .Controls.Add Type:=1, Id:=2941 'Select All 
      End With 

      With .Controls.Add(Type:=10) 
       .Caption = "Filter" 
       .Controls.Add Type:=1, Id:=210 'Sort Ascending 
       .Controls.Add Type:=1, Id:=211 'Sort Descending 
       .Controls.Add Type:=1, Id:=640 'Filter By Selection 
       .Controls.Add Type:=1, Id:=3017 'Filter Excluding Selection 
       .Controls.Add Type:=2, Id:=2863 'Filter For 
       .Controls.Add Type:=1, Id:=605 'Remove Filter/Sort 
      End With 

     End With 

     Me.Controls(CntrlName).ShortcutMenuBar = CntrlShortcutMenu 

ExitSub: 
    Set cmdShortcutMenu = Nothing 
    Exit Sub 
errhandler: 
    Debug.Print "CreateControlShortcutMenu", Err.Description 
    Resume ExitSub 
End Sub 
+0

順便說一句,如果有人想要快捷菜單和其他詳細信息的所有代碼(ID),請查看[這裏](https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=6627 )。 – Cinetyk

相關問題