Option ExplicitPrivate MoveStartX As Single
Private MoveStartY As SinglePrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then
    MoveStartX = X
    MoveStartY = Y
  End If
End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then
    Picture1.Left = Picture1.Left + (X - MoveStartX)
    Picture1.Top = Picture1.Top + (Y - MoveStartY)
  End If
End Sub

解决方案 »

  1.   

    谢谢sail_about(逛荡) ,你的办法可行的,我也能够理解,但为什么我的方法就不行呢?能够给我解释一下吗?迷惑?
      

  2.   

    问题在Picture1.Left = X,Picture1.Top = Y这两句,X,Y返回鼠标在Picture1上的坐标,你将此作为Picture1的左顶点坐标移动Picture1,而Picture1移动后鼠标的相对位置在Picture1上发生了改变,于是又引发MouseMove事件,如此反复,总不能使鼠标在Picture1上的位置相同,所以不断引发MouseMove,出现抖动现象。
    设定开始点的方法可避免这一现象发生,鼠标移动引发MouseMove事件,Picture1位置相对鼠标方向和距离发生改变,鼠标位置发生了改变,又引发MouseMove,由于Picture1的移动是相对鼠标移动发生的,所以这次MouseMove的X,Y与MoveStartX,MoveStartY相同,因此不能产生Picture1的移动,于是也就不会再发生MouseMove了。
    加个监视就能看明白了:MouseMove是成对发生的,第二次发生时X,Y与MouseDown相同了。
    Option ExplicitPrivate MoveStartX As Single
    Private MoveStartY As Single
    Dim i As LongPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 1 Then
        MoveStartX = X
        MoveStartY = Y
        i = 0
        Debug.Print i & "-" & X & "-" & Y
      End If
    End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 1 Then
        Picture1.Left = Picture1.Left + (X - MoveStartX)
        Picture1.Top = Picture1.Top + (Y - MoveStartY)
        i = i + 1
        Debug.Print i & "-" & X & "-" & Y
      End If
    End Sub
      

  3.   

    up 一下吧!
    不过你的思路是不对的,要用mousedown事件记下坐标,再用mousemove事件记下秒动的坐标,当然你的autoredraw看看是不要该成false!