热情软件屋

 

在电子地图中画折线,点击此折线上任意一点,此线就能被选中


编号:QA004512
建立日期: 2002年1月2日 最后修改日期:2002年1月2日
所属类别:

76426:
    操作系统:WIN
    编程工具:VB
    问题:在电子地图中,可以在上面画折线,画完后,点击此折线上任意一点,此线就能被选中。我想在VB中制作这一效果,所画的线能被选中,该如何做呢?线也没有CLICK的事件呀?

回答:

    你好!我是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回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio