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
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
其实很简单,你只需在代码里面加上Me.Caption = sglPos就可以随时在标题栏看出X,Y~
'将该类命名为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
你下的断点在哪里?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
你的Debug.Print打在哪了?
感谢你的帮助,我刚才说0是说错了,不过希望你再看一下我的回复!
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
感谢你的帮忙,我先把我的问题解决了,再看你的代码,多谢!
X是鼠标在imgSplitter中的坐标,但MouseMove时,随着鼠标动的是picSplitter,而imgSplitter并没有动,所以这里检测到的X实际上鼠标在窗体中的当前位置减去imgSplitter.Left的值,往左移就是负的,往右移就是正的。问题的本质:
在某一个控件的MouseMove中检测X值,如果按住鼠标左键在该控件中移动,那么当鼠标移出该控件时,该控件的MouseMove事件仍然有效。
Debug.Print X
End Sub
既然是负数,说明鼠标已经移到Img左边,并且已经移出,既然已经移出,Img便不可能还能够俘获鼠标移动事件,既然Img不可能俘获鼠标移动事件,那便不会有负数,这不是自相矛盾么?
告诉我,你鼠标移到哪里了怎么会有负数?????
在还没有搞清楚相对坐标的概念之前,移动鼠标的时候你干吗还要按下去移~~
把我也弄晕了~~
在VB中新建工程时不选“标准exe”而选择“VB 应用程序向导”,再选择新建一个资源管理器样式的程序,里面有Splitter的代码。
Jackile(东方朔) 是这么建的工程。 :)