仅在特定窗体控件(文本框)上启用快捷菜单

问题描述:

这与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.txtA.Top * 1440且Y

您可以通过在运行中创建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