- Код: Выделить всё
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (cPoint As POINTAPI) As Long
' Функция возвращает расстояние от заданой точки до элемента управления на форме.
' Если координаты точки не заданы, то ф-ция использует координаты курсора мышки
' в качестве координатов точки. Также ф-ция возвращает координаты (sX, sY)
' ближайшей точки от элемента управления до заданой точки.
'
' Работает, если свойство формы BorderStyle = 0.
Function GetDistanceToControl(inForm As Form, inControl As Control, Optional X As Variant, Optional Y As Variant, Optional sX As Long, Optional sY As Long) As Long
Dim MouseCoords As POINTAPI
Dim tmpDIST As Long
Dim X1, Y1, X2, Y2
' Если координаты точки не заданы используем координаты мышки
If IsMissing(X) And IsMissing(Y) Then _
GetCursorPos MouseCoords: _
X = Screen.TwipsPerPixelX * MouseCoords.X: _
Y = Screen.TwipsPerPixelY * MouseCoords.Y
' Нахождение крайних точек элемента управления и вычисление расстояния
X1 = inForm.Left + inControl.Left
Y1 = inForm.Top + inControl.Top
X2 = inForm.Left + inControl.Left + inControl.Width
Y2 = inForm.Top + inControl.Top + inControl.Height
' Нахождение ближайшей стороны или угла и вычисление расстояния
If X >= X1 And X <= X2 And Y <= Y1 And Y <= Y2 Then
tmpDIST = (Y1 - Y)
sX = X
sY = Y1
ElseIf X >= X1 And X <= X2 And Y > Y1 And Y >= Y2 Then
tmpDIST = (Y - Y2)
sX = X
sY = Y2
ElseIf Y >= Y1 And Y <= Y2 And X < X1 And X <= X2 Then
tmpDIST = (X1 - X)
sX = X1
sY = Y
ElseIf Y >= Y1 And Y <= Y2 And X > X1 And X >= X2 Then
tmpDIST = (X - X2)
sX = X2
sY = Y
ElseIf X < X1 And Y < Y1 Then
tmpDIST = Sqr((X1 - X) ^ 2 + (Y1 - Y) ^ 2)
sX = X1
sY = Y1
ElseIf X > X2 And Y < Y1 Then
tmpDIST = Sqr((X2 - X) ^ 2 + (Y1 - Y) ^ 2)
sX = X2
sY = Y1
ElseIf X < X1 And Y > Y2 Then
tmpDIST = Sqr((X1 - X) ^ 2 + (Y2 - Y) ^ 2)
sX = X1
sY = Y2
ElseIf X > X2 And Y > Y2 Then
tmpDIST = Sqr((X2 - X) ^ 2 + (Y2 - Y) ^ 2)
sX = X2
sY = Y2
Else
sX = X
sY = Y
tmpDIST = 0
End If
GetDistanceToControl = tmpDIST
End Function