在电子地图中画折线,点击此折线上任意一点,此线就能被选中
编号:QA004512
建立日期: 2002年1月2日 最后修改日期:2002年1月2日
所属类别:
Q
76426:
操作系统:WIN
编程工具:VB
问题:在电子地图中,可以在上面画折线,画完后,点击此折线上任意一点,此线就能被选中。我想在VB中制作这一效果,所画的线能被选中,该如何做呢?线也没有CLICK的事件呀?
A回答:
你好!我是sxfbetter ,信箱是sxfbetter@sohu.com,希望能给你们有些帮助。
这样可以解决:利用api函数
Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long
Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal
PolyFillMode As Long) As Long
1、首先将该线段的区域句柄获得;
可以这样想象,虽然是条线段,但可以扩展为一个小范围的矩形,先获得矩形的区域句柄
Private Type POINTAPI
x As Long
y As Long
End Type
Dim myMouse(3) As POINTAPI '为线定义句柄所用区域
dim Handle as long
myMouse(0).x = .X1 - 5 '仅在线的周围加5,可以由自己设置区域大小
myMouse(0).y = .Y1 + 5
myMouse(1).x = .X1 + 5
myMouse(1).y = .Y1 + 5
myMouse(2).x = .X1 + .Width + 5
myMouse(2).y = .Y1 + .Height - 5
myMouse(3).x = .X1 + .Width - 5
myMouse(3).y = .Y1 + .Height - 5
Handle = CreatePolygonRgn(myMouse(0), 4, WINDING)
2、判断,在mousedown事件里编程,可以将所有的线的句柄存在数组里,循环判断
Public Function GetHandle(x As Single, y As Single, myHandle As Long) As Boolean
'============================================
'模块功能:获取鼠标选中的对象,返回值为 Boolean
'============================================
Dim i As Integer
i = PtInRegion(myHandle, x, y)
If i <> 0 Then
GetHandle = True
End If
End Function
3、实际上这是判断点是否在区域中的问题,如果将图形抽象成类,那绘制的图形都是对象,我们可以将所绘制的对象加入集合中对象中,而上面所说的仅是我的图形对象的一个属性而已,通过集合的循环来判断。而在类中要定义事件,在窗体上声明该对象,这样在选中该线段的时候,则会触发选中事件。
当然你的先在类模块中定义事件,该事件在选中的是否触发
Public Event IsSelected()
在类中属性中触发事件
Public Property Let HitMe(ByVal vdata As Boolean)
mvarStatus = vdata
RaiseEvent ShowStatus
End Property
窗体上定义
Private WithEvents fpcObj As PictureClass '定义触发事件的类对象
每个代码窗体都有“通用”、“声明”。该语句声明完成后,则在窗体的“通用”中会显示出该对象,选中该对象后,在声明中选中该事件,则可以在选中事件中编程序了。
当然只有,fpcObj.HitMe = True 时,则会触发线段选中事件。这样就完成了点击线段,触发事件的全过程。如有疑问,可以来信。
hippopotamus的意见:
你画曲线得时候,记录这条线的轨迹,每次鼠标点击的时候对所有的记录进行检测,就可以判断选中哪条线.
是个笨方法,如你知道好的方法,请告诉小弟。
此问题由sxfbetter回答。
| |
|
|
| |
|
|