'Splitter是一个PictureBox Private Const SPLT_WDTH As Integer = 3 Private currSplitPosX As Long Dim CTRL_OFFSET As Integer Dim SPLT_COLOUR As Long Private Sub Form_Load() CTRL_OFFSET = 10 SPLT_COLOUR = &H808080 currSplitPosX = &H7FFFFFFF End SubPrivate Sub Form_Resize() Dim x1 As Integer Dim x2 As Integer Dim height1 As Integer Dim width1 As Integer Dim width2 As Integer On Error Resume Next height1 = ScaleHeight - (CTRL_OFFSET * 2) x1 = CTRL_OFFSET width1 = ListLeft.Width x2 = x1 + ListLeft.Width + SPLT_WDTH - 1 width2 = ScaleWidth - x2 - CTRL_OFFSET ListLeft.Move x1% - 1, CTRL_OFFSET, width1, height1 TextRight.Move x2, CTRL_OFFSET, width2 + 1, height1 Splitter.Move x1 + ListLeft.Width - 1, CTRL_OFFSET, SPLT_WDTH, height1 End SubPrivate Sub Splitter_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Splitter.BackColor = SPLT_COLOUR currSplitPosX = CLng(X) Else If currSplitPosX <> &H7FFFFFFF Then Splitter_MouseUp Button, Shift, X, Y currSplitPosX = &H7FFFFFFF End If End SubPrivate Sub Splitter_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If currSplitPosX& <> &H7FFFFFFF Then If CLng(X) <> currSplitPosX Then Splitter.Move Splitter.Left + X, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2) currSplitPosX = CLng(X) End If End If End SubPrivate Sub Splitter_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If currSplitPosX <> &H7FFFFFFF Then If CLng(X) <> currSplitPosX Then Splitter.Move Splitter.Left + X, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2) End If currSplitPosX = &H7FFFFFFF Splitter.BackColor = &H8000000F If Splitter.Left > 60 And Splitter.Left < (ScaleWidth - 60) Then ListLeft.Width = Splitter.Left - ListLeft.Left 'the pane is within range ElseIf Splitter.Left < 60 Then 'the pane is too small ListLeft.Width = 60 Else ListLeft.Width = ScaleWidth - 60 'the pane is too wide End If Form_Resize End If End Sub
Private Const SPLT_WDTH As Integer = 3
Private currSplitPosX As Long
Dim CTRL_OFFSET As Integer
Dim SPLT_COLOUR As Long
Private Sub Form_Load()
CTRL_OFFSET = 10
SPLT_COLOUR = &H808080
currSplitPosX = &H7FFFFFFF
End SubPrivate Sub Form_Resize()
Dim x1 As Integer
Dim x2 As Integer
Dim height1 As Integer
Dim width1 As Integer
Dim width2 As Integer
On Error Resume Next
height1 = ScaleHeight - (CTRL_OFFSET * 2)
x1 = CTRL_OFFSET
width1 = ListLeft.Width
x2 = x1 + ListLeft.Width + SPLT_WDTH - 1
width2 = ScaleWidth - x2 - CTRL_OFFSET
ListLeft.Move x1% - 1, CTRL_OFFSET, width1, height1
TextRight.Move x2, CTRL_OFFSET, width2 + 1, height1
Splitter.Move x1 + ListLeft.Width - 1, CTRL_OFFSET, SPLT_WDTH, height1
End SubPrivate Sub Splitter_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Splitter.BackColor = SPLT_COLOUR
currSplitPosX = CLng(X)
Else
If currSplitPosX <> &H7FFFFFFF Then Splitter_MouseUp Button, Shift, X, Y
currSplitPosX = &H7FFFFFFF
End If
End SubPrivate Sub Splitter_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If currSplitPosX& <> &H7FFFFFFF Then
If CLng(X) <> currSplitPosX Then
Splitter.Move Splitter.Left + X, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
currSplitPosX = CLng(X)
End If
End If
End SubPrivate Sub Splitter_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If currSplitPosX <> &H7FFFFFFF Then
If CLng(X) <> currSplitPosX Then
Splitter.Move Splitter.Left + X, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
End If
currSplitPosX = &H7FFFFFFF
Splitter.BackColor = &H8000000F
If Splitter.Left > 60 And Splitter.Left < (ScaleWidth - 60) Then
ListLeft.Width = Splitter.Left - ListLeft.Left 'the pane is within range
ElseIf Splitter.Left < 60 Then 'the pane is too small
ListLeft.Width = 60
Else
ListLeft.Width = ScaleWidth - 60 'the pane is too wide
End If
Form_Resize
End If
End Sub