Функция: Расстояние от контрола к точке

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Функция: Расстояние от контрола к точке

Сообщение t116 » 18.07.2007 (Ср) 15:24

Может, кому-то пригодится:

Код: Выделить всё

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

Последний раз редактировалось t116 19.07.2007 (Чт) 12:16, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2007 (Ср) 16:17

Это не кирпич, это 6 класс, теорема Пифагора.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 17:36

И таки-да, без формуляра и савсэм-савсэм без доки.
Переношу в Проекты.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.07.2007 (Чт) 15:02

t116, а ты учитываешь, что точка и контрол могут быть в разных контейнерах?
Lasciate ogni speranza, voi ch'entrate.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 19.07.2007 (Чт) 19:37

alibek писал(а):t116, а ты учитываешь, что точка и контрол могут быть в разных контейнерах?


нет.


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList