我写出来了。不知合不合用。 Public Function PointOnLine(ByVal x, ByVal y, _ ByVal lx1 As Long, ByVal ly1 As Long, _ ByVal lx2 As Long, ByVal ly2 As Long, _ ByVal LWidth As Long) As Boolean 'x,y: 点坐标 'lx1,ly1,lx2,ly2: 线端点坐标 'LWidth: 线宽,点到线距离小于线宽一半则认为在线上,该值可适当设大一些
Dim k As Single Dim l As Long Dim LHelfWidth As Long Dim maxx&, maxy&, minx&, miny& LHelfWidth = LWidth /2 If lx1 > lx2 Then maxx = lx1 + LHelfWidth minx = lx2 - LHelfWidth Else maxx = lx2 + LHelfWidth minx = lx1 - LHelfWidth End If If ly1 > ly2 Then maxy = ly1 + LHelfWidth miny = ly2 - LHelfWidth Else maxy = ly2 + LHelfWidth miny = ly1 - LHelfWidth End IfIf x > minx And x < maxx Then If y > miny And y < maxy Then If lx1 - lx2 = 0 Then If x > lx1 - LHelfWidth And x < lx1 + LHelfWidth Then PointOnLine = True Else PointOnLine = False End If Exit Function ElseIf ly1 - ly2 = 0 Then If y = ly1 - LHelfWidth And y = ly1 + LHelfWidth Then PointOnLine = True Else PointOnLine = False End If Exit Function Else k = (ly1 - ly2) / (lx1 - lx2) If Abs(k) > 5 Then l = Abs(y - k * x - (ly1 - k * lx1)) / Abs(k) Else l = Abs(y - k * x - (ly1 - k * lx1)) / Sqr(k * k + 1) End If If l - 50 < LHelfWidth Then PointOnLine = True Else PointOnLine = False End If Exit Function End If Else PointOnLine = False End If Else PointOnLine = False End If End Function
记下点击位置,再看看哪条line的坐标与之相符。
使用API函数LineDDA, Declare Function LineDDA Lib "gdi32" (ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal lpLineDDAProc As Long, ByVal lParam As Long) As Long n1,n2和n3,n4是线的两端坐标,ipLineDDAproc是lineDDA的CallBack函数地址......这么着吧,看王国荣的windows api讲座,里面有里程
Public Function PointOnLine(ByVal x, ByVal y, _
ByVal lx1 As Long, ByVal ly1 As Long, _
ByVal lx2 As Long, ByVal ly2 As Long, _
ByVal LWidth As Long) As Boolean
'x,y: 点坐标
'lx1,ly1,lx2,ly2: 线端点坐标
'LWidth: 线宽,点到线距离小于线宽一半则认为在线上,该值可适当设大一些
Dim k As Single
Dim l As Long
Dim LHelfWidth As Long
Dim maxx&, maxy&, minx&, miny&
LHelfWidth = LWidth /2
If lx1 > lx2 Then
maxx = lx1 + LHelfWidth
minx = lx2 - LHelfWidth
Else
maxx = lx2 + LHelfWidth
minx = lx1 - LHelfWidth
End If
If ly1 > ly2 Then
maxy = ly1 + LHelfWidth
miny = ly2 - LHelfWidth
Else
maxy = ly2 + LHelfWidth
miny = ly1 - LHelfWidth
End IfIf x > minx And x < maxx Then
If y > miny And y < maxy Then
If lx1 - lx2 = 0 Then
If x > lx1 - LHelfWidth And x < lx1 + LHelfWidth Then
PointOnLine = True
Else
PointOnLine = False
End If
Exit Function
ElseIf ly1 - ly2 = 0 Then
If y = ly1 - LHelfWidth And y = ly1 + LHelfWidth Then
PointOnLine = True
Else
PointOnLine = False
End If
Exit Function
Else
k = (ly1 - ly2) / (lx1 - lx2)
If Abs(k) > 5 Then
l = Abs(y - k * x - (ly1 - k * lx1)) / Abs(k)
Else
l = Abs(y - k * x - (ly1 - k * lx1)) / Sqr(k * k + 1)
End If
If l - 50 < LHelfWidth Then
PointOnLine = True
Else
PointOnLine = False
End If
Exit Function
End If
Else
PointOnLine = False
End If
Else
PointOnLine = False
End If
End Function
Declare Function LineDDA Lib "gdi32" (ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal lpLineDDAProc As Long, ByVal lParam As Long) As Long
n1,n2和n3,n4是线的两端坐标,ipLineDDAproc是lineDDA的CallBack函数地址......这么着吧,看王国荣的windows api讲座,里面有里程