Rubrik: Controls · ListView | VB-Versionen: VB4, VB5, VB6 | 26.09.03 |
Doppelklick im ListView/TreeView korrekt auswerten Beim Doppelklick im ListView- bzw. TreeView-Control sollte man prüfen, ob der Klick auf einen bestehenden Eintrag erfolgte oder ins Leere. | ||
Autor: Dieter Otter | Bewertung: | Views: 31.008 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Beim Doppelklick in ein ListView- bzw. TreeView-Control wird bekanntlich das DblClick-Ereignis ausgelöst. Über die SelectedItem-Eigenschaft lässt sich dann ermitteln, auf welchen Eintrag der Doppelklick erfolgte:
Private Sub ListView1_DblClick() If Not ListView1.SelectedItem Is Nothing Then MsgBox "Doppelklick auf " & ListView1.SelectedItem.Text End If End Sub
Was aber, wenn der Doppelklick ins Leere ging? D.h. der Anwender auf einen freien Bereich im ListView/TreeView klickte? Dann würde obiger Code dennoch den aktuell selektierten Eintrag anzeigen, obwohl der Klick gar nicht auf diesen Eintrag erfolgte!
Die Lösung hierzu lautet: Per HitTest-Methode prüfen, auf welchen Eintrag der Klick erfolgte.
Option Explicit ' Hilfsvariablen Dim MouseX As Single Dim MouseY As Single
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Mausposition merken MouseX = X MouseY = Y End Sub
Private Sub ListView1_DblClick() Dim oItem As ListItem ' Eintrag ermitteln Set oItem = ListView1.HitTest(MouseX, MouseY) If Not oItem Is Nothing Then MsgBox "Klick auf " & oItem.Text End If End Sub
Das funktioniert jetzt schon gut. Aber leider braucht man immer zwei Hilfsvariablen und darf nicht vergessen, im MouseDown-Ereignis die Mausposition zwischenzuspeichern.
Es geht aber auch anders
Mit Hilfe der API-Funktion GetCursorPos lässt sich die aktuelle Mausposition ermitteln. Diese bezieht sich zwar auf das Screen-Objekt, lässt sich aber sehr einfach mit der ScreenToClient API-Funktion umrechnen.
Option Explicit ' Benötigte API-Deklarationen Private Declare Function GetCursorPos Lib "user32" ( _ lpPoint As POINTAPI) As Long Private Declare Function ScreenToClient Lib "user32" ( _ ByVal hwnd As Long, _ lpPoint As POINTAPI) As Long Private Type POINTAPI x As Long y As Long End Type
Private Sub ListView1_DblClick() Dim oItem As ListItem Dim P As POINTAPI ' aktuelle Mausposition GetCursorPos P ScreenToClient ListView1.hwnd, P ' Eintrag ermitteln Set oItem = ListView1.HitTest( _ P.x * Screen.TwipsPerPixelX, _ P.y * Screen.TwipsPerPixelY) If Not oItem Is Nothing Then MsgBox "Klick auf " & oItem.Text End If End Sub