Üblicherweise wird ein Kontextmenü (sofern eines im aktuellen Kontext vorhanden) beim Loslassen des rechten Mausknopfes angezeigt. Die entsprechende Code-Stelle in Visual Basic ist das MouseUp-Ereignis eines Forms oder Steuerelements:
Private Sub XYZControl_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = vbRightButton Then
PopupMenu ...
End If
End Sub
Auch zum Anzeigen eines Kontextmenüs per Tastatur gibt es eine Konvention. Seit Etablierung der Kontextmenü-Idee seinerzeit mit Windows 95 dient die Tastenkombination Umschalt-F10 zur Anzeige. Auf der später eingeführten "Windows"-Tastatur kann ein Kontextmenü auch über die Anwendungstaste geöffnet werden. Bezüglich der Positionierung herrscht keine Eindeutigkeit vor. Mangels einer Positionsvorgabe durch den Mauszeiger entscheiden sich einige für eine neutrale Positionierung in der linken, oberen Ecke des betreffenden Kontexts bzw. Steuerelements, andere für ein zentriertes Öffnen über dieser Fläche. "Zentriert" bedeutet hier allerdings nichts anderes als die Zentrierung der linken, oberen Ecke des Menüs. Ein Mechanismus, der die tatsächliche Größe des sich öffnenden Menüs ermitteln sollte, um es flächig zentrieren zu können, müsste ungeheuer flexibel sein - und genau so ungeheuer aufwändig.
Die folgende Prozedur PopupMenuKey können Sie aus einer KeyDown-Ereignisprozedur heraus aufrufen. Am besten rufen Sie sie dort als erstes auf, da sie im Falle eines "Treffers" den KeyCode-Wert "schluckt" und Sie somit weitere Tasten erst gar nicht zu prüfen brauchen. Sie übergeben ihr das Objekt (Steuerelement, Form usw.), über dem das Kontextmenü erscheinen soll, den in KeyDown übergebenen KeyCode und den Shift-Status, und das anzuzeigende Kontextmenü. Optional können Sie zusätzlich noch das Menü-Element, das als Vorgabekennzeichnung mit fetter Beschriftung erscheinen soll, übergeben. Und im letzten Parameter legen Sie fest, ob das Kontextmenü wie oben beschrieben zentriert werden soll. Die Prozedur arbeitet mit Steuerelementen (Objekttyp Control), Forms und PropertyPages. Bei Verwendung mit einem UserControl sollten Sie entweder dessen Extender übergeben, oder eine spezialisierte Variante innerhalb des Code-Moduls des UserControls anlegen (ein UserControl lässt sich nämlich nicht so einfach als Parameter übergeben).
Public Sub PopupMenuKey(Control As Object, KeyCode As Integer, _
ByVal Shift As Integer, Menu As Menu, _
Optional DefaultMenu As Menu, Optional ByVal Centered As Boolean)
Const vbKeyApps = &H5D
Select Case KeyCode
Case vbKeyF10
If Shift = vbShiftMask Then
KeyCode = 0
Else
Exit Sub
End If
Case vbKeyApps
Select Case Shift
Case vbAltMask, vbAltMask Or vbShiftMask
Exit Sub
Case Else
KeyCode = 0
End Select
Case Else
Exit Sub
End Select
Select Case True
Case TypeOf Control Is Form, TypeOf Control Is PropertyPage
If Centered Then
With Control
If DefaultMenu Is Nothing Then
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
.ScaleWidth \ 2, .ScaleHeight \ 2
Else
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
.ScaleWidth \ 2, .ScaleHeight \ 2, DefaultMenu
End If
End With
Else
If DefaultMenu Is Nothing Then
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
0, 0
Else
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
0, 0, DefaultMenu
End If
End If
Case TypeOf Control Is Control
With Control
If Centered Then
If DefaultMenu Is Nothing Then
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
.Left + (.Width \ 2), .Top + (.Height \ 2)
Else
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
.Left + (.Width \ 2), .Top + (.Height \ 2), _
DefaultMenu
End If
Else
If DefaultMenu Is Nothing Then
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
.Left, .Top
Else
Menu.Parent.PopupMenu Menu, vbPopupMenuRightButton, _
.Left, .Top, DefaultMenu
End If
End If
End With
End Select
End Sub
|