CHICKENZZZ:用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:线段的第二个点 lpLineDDAProc: lineDDAProc Callback 程序, 调用LineDDA后, Windows 会以(n1,n2)-(n3,n4)所经过的点为参数调用此程序。 lParam:额外参数,补上0即可。dim x(2048) as long'记录线段经过的每一个点的x坐标 dim y(2048) as long'记录线段经过的每一个点的y坐标 dim n as integer'记录线段经过的点数n= 0 LineDDA n1,n2,n3,n4, AddressOf lineDDAProc, 0Sub lineDDAProc(ByVal x As Long, ByVal y As Long, ByVal lpData As Long) n= n+ 1 x(n)= x y(n)= y End Subx,y:鼠标按下时的位置 for i=1 to n if x(i)=x and y(i)=y then 您的代码(点中Line控件后所需的操作) end if next如很难点中Line,不妨将上述判断语句改为: if ((x(i)-x)^2+(y(i)-y)^2)^0.5<3 then
To xiaohuangtao(绿毛网虫):Line控件没有hWnd属性!
呵呵,看看后来我自己花几个小时想的解决方法,不用API的,不过思路和LineDDA一样,得出线上每点的座标然后再判断。里面有画直线算法的影子。Public Function PointInLine(ByVal PointX As Long, ByVal PointY As Long, _ ByVal LineX1 As Long, ByVal LineY1 As Long, _ ByVal LineX2 As Long, ByVal LineY2 As Long, _ ByVal LineWidth As Long) As Boolean
Dim DistanceX As Long, DistanceY As Long Dim IncreaseX As Long, IncreaseY As Long Dim SumX As Long, SumY As Long Dim PosX As Long, PosY As Long Dim I As Long
http://www.dapha.net/soure/pic/Draw%20a%20line%20on%20a%20Picture%20Box%20and%20Select%20it!.zip
代码名称 在picture内画线,然后选中画的线
代码类型 图形图像
运行环境 VB6.0/Win9x
授权方式 免费代码
代码大小 5K
代码评价
上传时间 2001-12-14
相关链接 主页
本日下载 1 本周:19 总计:19
下载地址1 下载
代码简介 虽然能选中线,不过好象不能移动那条线
比如Image
属性设置
Appearance=0
boardstyle=1
height=15(twips)这样您就可以在Image_Click事件中加入您想要的代码了假如想粗一点,可以做一个黑色或者其他颜色的图片填充
判断鼠标当前点是否与line的起点-终点相交或接近距离小于某值就算选中了
n1,n2:线段的第一个点
n3,n4:线段的第二个点
lpLineDDAProc: lineDDAProc Callback 程序, 调用LineDDA后, Windows 会以(n1,n2)-(n3,n4)所经过的点为参数调用此程序。
lParam:额外参数,补上0即可。dim x(2048) as long'记录线段经过的每一个点的x坐标
dim y(2048) as long'记录线段经过的每一个点的y坐标
dim n as integer'记录线段经过的点数n= 0
LineDDA n1,n2,n3,n4, AddressOf lineDDAProc, 0Sub lineDDAProc(ByVal x As Long, ByVal y As Long, ByVal lpData As Long)
n= n+ 1
x(n)= x
y(n)= y
End Subx,y:鼠标按下时的位置
for i=1 to n
if x(i)=x and y(i)=y then
您的代码(点中Line控件后所需的操作)
end if
next如很难点中Line,不妨将上述判断语句改为:
if ((x(i)-x)^2+(y(i)-y)^2)^0.5<3 then
ByVal LineX1 As Long, ByVal LineY1 As Long, _
ByVal LineX2 As Long, ByVal LineY2 As Long, _
ByVal LineWidth As Long) As Boolean
Dim DistanceX As Long, DistanceY As Long
Dim IncreaseX As Long, IncreaseY As Long
Dim SumX As Long, SumY As Long
Dim PosX As Long, PosY As Long
Dim I As Long
DistanceX = LineX2 - LineX1
DistanceY = LineY2 - LineY1
IncreaseX = Switch(DistanceX > 0, 1, DistanceX = 0, 0, DistanceX < 0, -1)
IncreaseY = Switch(DistanceY > 0, 1, DistanceY = 0, 0, DistanceY < 0, -1)
PosX = LineX1
PosY = LineY1
DistanceX = Abs(DistanceX)
DistanceY = Abs(DistanceY)
If DistanceX > DistanceY Then
For I = 0 To DistanceX
SumX = SumX + DistanceX
SumY = SumY + DistanceY
If PosX = PointX Then
If Abs(PointY - PosY) <= LineWidth Then PointInLine = True Else PointInLine = False
Exit For
End If
If SumX > DistanceX Then
SumX = SumX - DistanceX
PosX = PosX + IncreaseX
End If
If SumY > DistanceX Then
SumY = SumY - DistanceX
PosY = PosY + IncreaseY
End If
Next
Else
For I = 0 To DistanceY
SumX = SumX + DistanceX
SumY = SumY + DistanceY
If PosY = PointY Then
If Abs(PointX - PosX) <= LineWidth Then PointInLine = True Else PointInLine = False
Exit For
End If
If SumX > DistanceY Then
SumX = SumX - DistanceY
PosX = PosX + IncreaseX
End If
If SumY > DistanceY Then
SumY = SumY - DistanceY
PosY = PosY + IncreaseY
End If
Next
End IfEnd Function