仅在特定表单控件 (TextBox) 上启用快捷菜单

Posted

技术标签:

【中文标题】仅在特定表单控件 (TextBox) 上启用快捷菜单【英文标题】:Enabling Shortcut Menu only on a specific Form control (TextBox) 【发布时间】:2017-03-03 15:53:08 【问题描述】:

这与this question密切相关,尚未发布答案。

我有一个表单,我希望只有在该表单上的文本框内单击时才启用快捷菜单(右键单击弹出的菜单)(在其他任何地方都禁用)。问题是该选项似乎只对整个表单是全局的。

将表单的 ShortcutMenu 设置为 False,我可以在 TextBox 的“On Enter”事件中使用“ShortcutMenu = True”将其设置为 True,这样在输入 TextBox 之前右键单击什么也不做。这样做的问题是,当用户进入TextBox时,如果他在表单中的其他任何地方右键单击,就会出现右键菜单,这不是我想要的。

在同一个 TextBox 的“On Exit”事件中使用“ShortcutMenu = False”禁用 ShortcutMenu 有效,但前提是用户点击了另一个控件,而不是之前,这不能解决问题。

在某个地方执行右键单击操作之前,是否有运行“ShortcutMenu = False”? (进入文本框后)。类似于“鼠标离开此控件”事件?

【问题讨论】:

不确定,但您能否使用 Form 'MouseMove' 事件来确定是否在该框上,或者可能是 MouseDown 事件或 GotFocus 事件? 在 TextBox 上使用 GotFocus 会导致启用快捷菜单的行为与我上面使用的类似。我可以看到 MouseMove 工作,但我必须知道确切的位置,在 TextBox 的 Twips 中,所以我可以做“如果指针在框位置之外......”但我不够熟练,无法做到这一点。此外,这将继续执行闪烁表单内容的“ShortcutMenu = False”。 一英寸大约有 1440 缇。所以你可以立即检查 If X >= Me.txtA,Left * 1440 and X = Me.txtA.Top * 1440 and Y @WayneG.Dunn :感谢您的评论,但 O.Gungor 发布的解决方案有效,我时间紧迫,无法探索您的想法。 【参考方案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

【讨论】:

顺便说一句,如果有人想要快捷菜单的所有代码 (ID) 和其他详细信息,请查看 here。

以上是关于仅在特定表单控件 (TextBox) 上启用快捷菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何获取特定类型(按钮/文本框)的Windows窗体表单的所有子控件?

数据绑定到 TextBox - 在代码中设置 Text 属性不会更新模型

winform 窗体退出前判断表单是不是修改过,窗体上的控件有很多个,TextBox,combox,datagridview

GCC - 仅在特定功能上启用编译器标志

如何仅在特定屏幕(例如主屏幕)上启用抽屉导航 [react native] [react navigation]

使用 Interop.Access 仅在页眉部分(或正文或页脚)中获取控件