Als Antwort auf diesen Beitrag
Hallo,
das von Daniel angeführte "Problem" mit mehreren eigenen Koordinatensystemen je Control lässt sich, wenn man es brauchen sollte, relativ einfach lösen:
Man lenkt alle Moveaktivitäten der Controls und der Userform selbst in eine Sammel-Sub um und lässt dort die Position der Maus einheitlich für die Userform umrechnen.
Hier ein Beispiel:
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function ScreenToClient Lib "user32" ( _
ByVal hwnd As LongPtr, lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim PT As POINTAPI
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call GetMausPos
End Sub
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call GetMausPos
End Sub
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call GetMausPos
End Sub
Private Sub GetMausPos()
GetCursorPos PT
ScreenToClient GetActiveWindow(), PT
Debug.Print PT.X, PT.Y
End Sub
Hierbei wird davon ausgegangen, dass die Userform zwingend das gerade aktive Fenster ist. Müsste eigentlich immer so sein. Wer auf Nummer sicher gehen will, kann sich ja vorher z.B. über FindWindow das UF-Handle in einer Modulvariablen hWndUF retten und verwenden.
Beim Massengeschäft mit sehr vielen Controls gäbe es auch noch die Möglichkeit, sich in die Messageschleife einzuhooken oder Klassenprogrammierung zu verwenden.
Aufwand/Nutzen selbst beurteilen.
Gruß
Karl-Heinz