Private Sub imgSplitter_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim sglPos As Single
        If mbMoving Then
        sglPos = X + imgSplitter.Left
        If sglPos < sglSplitLimit Then
            picSplitter.Left = sglSplitLimit
        ElseIf sglPos > Me.Width - sglSplitLimit Then
            picSplitter.Left = Me.Width - sglSplitLimit
        Else
            picSplitter.Left = sglPos
        End If
    End If
End Sub

解决方案 »

  1.   

    代码不清楚,mbMoving是什么?请给全,帮你调试了一下,mbMoving请必须给出。一般来看,X,Y通常都是当前控件,X,Y应该是Img里面的坐标区。
    其实很简单,你只需在代码里面加上Me.Caption = sglPos就可以随时在标题栏看出X,Y~
      

  2.   

    X可是鼠标在imgSplitter上的水平坐标。
      

  3.   

    这个XY是imgSplitter中的值,不是在窗口里的值~~
      

  4.   

    我重新试了一下,在去掉了If mbMoving Then这句之后, 非常正常~~
      

  5.   

    To lvlvlvlylyly(那森) :代码是没有错,只是那个X我搞不清楚,为何是0?这个是VB自带的资源管理器的例子啊
      

  6.   

    在VB中新建工程时不选“标准exe”而选择“VB 应用程序向导”,再选择新建一个资源管理器样式的程序,里面有Splitter的代码。
      

  7.   

    VB自带的资源管理器的例子中的Splitter的Width只有150。  :)
      

  8.   

    告诉你了X是鼠标在imgSplitter控件上的坐标,不是窗口上的,窗口上的坐标应该是imgSplitter.left那你认为的X正确应该是多少啊~~
      

  9.   

    同意你的看法,但  sglPos = X + imgSplitter.Left,有什么意义啊,X永远为0啊!
      

  10.   

    '我可以给你一个用鼠标移动任何对象的Class,使用很简单!代码如下:
    '将该类命名为clsMove
    Option ExplicitPrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Type POINTAPI
            X As Long
            Y As Long
    End TypePublic Enum MoveFlag
            Move_Form_XY = 0
            Move_Control_XY = 1
            Move_Control_X = 2
            Move_Control_Y = 3
            Move_Form_X = 4
            Move_Form_Y = 5
    End EnumPublic CX As Long
    Public CY As Long
    Public ObjX As Long
    Public objY As Long
    Dim bMoveIt As Boolean
    Dim objObj As Object
    Dim lFlag As MoveFlag
    Dim bMove As BooleanPublic Property Let CanMoveIt(ByVal Value As Boolean)
        bMoveIt = Value
    End PropertyPublic Property Get CanMoveIt() As Boolean
        CanMoveIt = bMoveIt
    End PropertyPublic Sub InitMove(obj As Object, ByVal lFlags As MoveFlag, Optional ByVal bM As Boolean = True)
        Dim tPos As POINTAPI
        Set objObj = obj
        lFlag = lFlags
        GetCursorPos tPos
        CX = tPos.X
        CY = tPos.Y
        ObjX = obj.Left
        objY = obj.Top
        bMoveIt = bM
        bMove = True
    End SubPublic Sub MoveIt()
        Static bM As Boolean
        Dim dR As Long
        Dim lL As Long, lT As Long
        
        On Error GoTo Err1
        If bMove = False Then Exit Sub
        If bM = True Then Exit Sub
        bM = True
        Dim tPos As POINTAPI
        GetCursorPos tPos
        lL = objObj.Left
        lT = objObj.Top
        Select Case lFlag
               Case 0 'move a form
                    lL = ObjX + (tPos.X - CX) * Screen.TwipsPerPixelX
                    lT = objY + (tPos.Y - CY) * Screen.TwipsPerPixelY
               Case 1 'move a control
                    lL = ObjX + (tPos.X - CX)
                    lT = objY + (tPos.Y - CY)
               Case 2 'move a control x
                    lL = ObjX + (tPos.X - CX)
               Case 3 'move a control y
                    lT = objY + (tPos.Y - CY)
               Case 4 'move a form x
                    lL = ObjX + (tPos.X - CX) * Screen.TwipsPerPixelX
               Case 5 'move a form y
                    lT = objY + (tPos.Y - CY) * Screen.TwipsPerPixelY
        End Select
        If bMoveIt = True Then
           objObj.Left = lL
           objObj.Top = lT
        End If
        CX = tPos.X
        CY = tPos.Y
        ObjX = lL
        objY = lT
        bM = False
        Exit Sub
    Err1:
        bM = False
        If Err = 384 Then objObj.WindowState = 0
    End SubPublic Property Get ObjectName() As String
        On Error Resume Next
        ObjectName = objObj.Name
    End PropertyPublic Sub MoveOver()
    bMove = False
    End Sub'使用举例:在窗体中···
    Option ExplicitDim clsM As New clsMovePrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button = 1 Then
            clsM.InitMove Me, Move_Form_XY, True
        End If
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button = 1 Then
            clsM.MoveIt
        End If
    End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button = 1 Then
            clsM.MoveOver
        End If
    End Sub
      

  11.   

    记住,改类移动控件时,要将窗体的ScaleMode=3
      

  12.   

    基本上什么都有了,照 cuizm(射天狼)  的说法的话,那X最小也是(-1)*imgSplitter.Width,最大也是imgSplitter.Width啊,我越是不明白了?希望大家能给予我帮助!
      

  13.   

    sglPos = X + imgSplitter.Left谁说X永远为零????
    你下的断点在哪里?X的值不可能永远为“0”,
    Private Sub imgSplitter_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim sglPos As Single
        
      sglPos = X + imgSplitter.Left
            If sglPos < sglSplitLimit Then
                picSplitter.Left = sglSplitLimit
            ElseIf sglPos > Me.Width - sglSplitLimit Then
                picSplitter.Left = Me.Width - sglSplitLimit
            Else
                picSplitter.Left = sglPos
            End If
        Me.caption=X          ‘加上这句,X的值可以随时看到
    End Sub
      

  14.   

    to 楼主:
    你的Debug.Print打在哪了?
      

  15.   

    To  goodname008(卢培培,LPP Software) :
       感谢你的帮助,我刚才说0是说错了,不过希望你再看一下我的回复!
      

  16.   

    If mbMoving Then
            sglPos = X + imgSplitter.Left
            Debug.Print X  <------------------------------------
            If sglPos < sglSplitLimit Then
                picSplitter.Left = sglSplitLimit
            ElseIf sglPos > Me.Width - sglSplitLimit Then
                picSplitter.Left = Me.Width - sglSplitLimit
            Else
                picSplitter.Left = sglPos
            End If
        End If
      

  17.   

    To Rick110AAA(海牛猪猪) :
       感谢你的帮忙,我先把我的问题解决了,再看你的代码,多谢!
      

  18.   

    你是不是把X和sglPos搞混了?X绝对是Img里面的坐标
      

  19.   

    知道怎么回事了:
    X是鼠标在imgSplitter中的坐标,但MouseMove时,随着鼠标动的是picSplitter,而imgSplitter并没有动,所以这里检测到的X实际上鼠标在窗体中的当前位置减去imgSplitter.Left的值,往左移就是负的,往右移就是正的。问题的本质:
    在某一个控件的MouseMove中检测X值,如果按住鼠标左键在该控件中移动,那么当鼠标移出该控件时,该控件的MouseMove事件仍然有效。
      

  20.   

    ' 看看这段代码,你在按钮上按下鼠标左键然后把鼠标移出按钮试试看,和Splitter一个道理Option ExplicitPrivate Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Debug.Print X
    End Sub
      

  21.   

    你懂了,我糊涂了,你怎么弄出负数出来的??
    既然是负数,说明鼠标已经移到Img左边,并且已经移出,既然已经移出,Img便不可能还能够俘获鼠标移动事件,既然Img不可能俘获鼠标移动事件,那便不会有负数,这不是自相矛盾么? 
    告诉我,你鼠标移到哪里了怎么会有负数?????
      

  22.   

    大家看看我的最后回复,有错么?如有,请指正!因为是MouseMove事件,只要你鼠标一直在上面就会触发该事件的啊,有更好地解释吗?
      

  23.   

    哦,看了goodname008(卢培培,LPP Software)的,知道怎么回事了,我的控件位置和他遇见的不一样,当然会有负数了~
      

  24.   

    非常谢谢 goodname008(卢培培,LPP Software) ,我对你的答复非常满意!
      

  25.   

    Jackile(东方朔),你也真是晕~~
    在还没有搞清楚相对坐标的概念之前,移动鼠标的时候你干吗还要按下去移~~
    把我也弄晕了~~
      

  26.   

    to lvlvlvlylyly(那森) :
    在VB中新建工程时不选“标准exe”而选择“VB 应用程序向导”,再选择新建一个资源管理器样式的程序,里面有Splitter的代码。
    Jackile(东方朔) 是这么建的工程。   :)
      

  27.   

    lvlvlvlylyly(那森) 明白了吧!呵呵,差点把我弄糊涂掉!非常感谢你参与我的问题!