我用鼠标移动图片,用IMAGE控件。
但是移动的时候,必须移动到现在的IMAGE控件的区域外。因为鼠标在IMAGE控件上,此时返回不了鼠标这点的坐标。
请问如何来实现呢。
想用鼠标进行随意拖动。

解决方案 »

  1.   

    调用API
    setcapture  将鼠标定住
    releasecapture 释放
      

  2.   

    楼主看下这个代码:
    Option ExplicitPrivate Declare Function GetCursorPos Lib "user32" (lpBuffer As Long) As LongPrivate mlDX As Long, mlDY As Long
    Private mlMoveFlag   As Long
    Private cx&, cy&Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If (Button = 1) Then
          Call GetCursorPos(cx)
          mlDX = cx - Image1.Left \ 15
          mlDY = cy - Image1.Top \ 15
          mlMoveFlag = 1
       End If
    End SubPrivate Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If (mlMoveFlag = 1) Then
          Call GetCursorPos(cx)
          Image1.Left = (cx - mlDX) * 15
          Image1.Top = (cy - mlDY) * 15
       End If
    End SubPrivate Sub Image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       mlMoveFlag = 0
    End Sub
      

  3.   

    Mouse_Up 之后,查找与当前 Image 的 .Left 和 .Top 属性值最接近且差小于 Image 的 .Width/2 或 .Height/2 的其他 Image 控件的相应属性值,赋给当前 Image 控件的相应属性。
      

  4.   


    还有一种方式,就是“网格”对齐。当然,这个网格是不可见的。比如,你将网格定义为纵横间距均为 10 倍像素或你为 Form 定义的其他 Scale 单位。每当你拖放后,都向最近的网格对齐。具体到上述的例子,Left 或 Top 值个位小于 5 的舍弃个位,大于 5 的加 5 后舍弃个位。
      

  5.   

    非常感谢各位的耐心解答。但我的问题还是没有解决。刚刚接触VB两周多。
    我这里所指的拖动,就是程序运行后,我有两个IMAGE的控件,想通过鼠标拖动,把两个控件对齐。
    现在拖动后,两个控件的LEFT和TOP都还是有差距,看起来都没有对齐。
    求详细,谢谢!
      

  6.   

    照你这样说,鬼才知道你的“另一个IMAGE的控件”是哪个 Image 。
    你的窗口布局以及你究竟是怎样个操作法,或者源码不放出来,我们怎么知道如何去解决。
    老是把别人当神仙一样的看待。
      

  7.   

    想要有对齐功能,就需要一个磁吸效果。简单来说就是判断一下当前的X与Y哪个是在一定像素值以内(例如5像素),是则自动将当前移动的目标的X或Y与要对齐的目标修正到对齐的值。不过最好还要增加一个ALT键检测,以便在按下ALT键时禁用磁吸效果,因为有时两个对象靠得足够近时并不一定都是要对齐。