|
Steuerelemente wie ListView und TreeView aus den Microsoft Common Controls bieten eine HitTest-Funktion, die Ihnen ein ListItem bzw. einen Node liefert, wenn sich eine gegebene Koordinate (X und Y) innerhalb des Rechtecks dieses Elements befindet. Die beiden Steuerelemente Statusbar und Toolbar bieten diese Testmöglichkeit jedoch nicht.
Die beiden folgenden Funktionen StatusbarHitTest und ToolbarHitTest bilden diese Funktion nach und liefern das entsprechende Element zu einem gegebenen Koordinatenpaar bzw. geben Nothing zurück, wenn dazu kein Element gefunden wurde.
Da zur Ermittlung eines Elements die Collection der Elemente durchlaufen werden muss, wird zunächst sinnvollerweise geprüft, ob sich die Koordinaten überhaupt innerhalb des Steuerelements befinden - bei einem niedergedrückten Mausknopf braucht dies nicht der Fall zu sein. Damit dies unabhängig von der ScaleMode-Einstellung des Containers, auf dem das Steuerelement platziert ist, erfolgen kann, wird die Innengröße des Steuerelements mittels der API-Funktion GetClientRect ermittelt.
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long
Public Function StatusbarHitTest(Statusbar As Statusbar, _
ByVal X As Single, ByVal Y As Single) As Panel
Dim nRect As RECT
Dim nPanel As Panel
With Statusbar
GetClientRect .hwnd, nRect
Select Case X
Case 0 To nRect.Right * Screen.TwipsPerPixelX
Select Case Y
Case 0 To nRect.Bottom * Screen.TwipsPerPixelY
For Each nPanel In .Panels
With nPanel
Select Case X
Case .Left To .Left + .Width
Set StatusbarHitTest = nPanel
Exit For
End Select
End With
Next
End Select
End Select
End With
End Function
Public Function ToolbarHitTest(Toolbar As Toolbar, _
ByVal X As Single, ByVal Y As Single) As Button
Dim nRect As RECT
Dim nButton As Button
With Toolbar
GetClientRect .hwnd, nRect
Select Case X
Case 0 To nRect.Right * Screen.TwipsPerPixelX
Select Case Y
Case 0 To nRect.Bottom * Screen.TwipsPerPixelY
For Each nButton In .Buttons
With nButton
Select Case X
Case .Left To .Left + .Width
Select Case Y
Case .Top To .Top + .Height
Set ToolbarHitTest = nButton
Exit For
End Select
End Select
End With
Next
End Select
End Select
End With
End Function
|