您可以通過在運行中創建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
不確定,但是您可以使用Form'MouseMove'事件來確定是否在該框中,或者可能是MouseDown事件或GotFocus事件? –
在文本框上使用GotFocus會產生類似的行爲,以啓用快捷菜單到我上面使用的內容。我可以看到MouseMove正在工作,但我必須知道TextBox Twip中的確切位置,所以我可以這樣做「如果指針位於外框位置,那麼......」但我不夠精通。此外,這將繼續執行「ShortcutMenu = False」,它會使表單內容閃爍。 – Cinetyk
每英寸約有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) –