SplitterBar




Option Explicit
'variable to hold the width of the splitter bar

Private Const SPLT_WDTH As Integer = 3
'variable to hold the last-sized position

Private currSplitPosX As Long
'variable to hold the horizontal & vertical

' offsets of the 2 controls

Dim CTRL_OFFSET As Integer
'variable to hold the Splitter bar colour

Dim SPLT_COLOUR As Long
Private Sub Form_Load()

'set the startup variables

CTRL_OFFSET = 5
SPLT_COLOUR = &H808080

'set the current splitter bar position to an arbitrary value that will always be outside

'the possible range. This allows us to check for movement of the spltter bar in subsequent

'mousexxx subs.

currSplitPosX = &H7FFFFFFF
ListLeft.AddItem "Left list Item 1"
ListLeft.AddItem "Left list Item 2"
ListLeft.AddItem "Left list Item 3"
ListLeft.AddItem "Left list Item 4"
ListLeft.AddItem "Left list Item 5"

'note: VB3 users will need to substitute Chr$(13) & chr$(10) for the VB4

'constant vbCrLf in the sentence below.

'TextRight = "This code demonstrates how to implement a splitter bar in a _

' Visual Basic Project." & vbCrLf & vbCrLf & "It's actions are controlled through _

' the MouseDown, MouseMove and MouseUp subs of the Splitter Picturebox, and the _

' Resize event of the form."

End Sub

Private 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

'set the height of the controls

height1 = ScaleHeight - (CTRL_OFFSET * 2)
width1 = ListLeft.Width
x1 = CTRL_OFFSET
x2 = x1 + width1 + SPLT_WDTH - 1
width2 = ScaleWidth - x2 - CTRL_OFFSET

'move the left list

ListLeft.Move x1 - 1, CTRL_OFFSET, width1, height1

'move the right textbox

TextRight.Move x2, CTRL_OFFSET, width2 + 1, height1

'move the splitter bar

Splitter.Move x1 + ListLeft.Width - 1, CTRL_OFFSET, SPLT_WDTH, height1
End Sub

Private Sub splitter_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbLeftButton Then

'change the splitter colour

Splitter.BackColor = SPLT_COLOUR

'set the current position to x

currSplitPosX = CLng(x)
Else

'not the left button, so... if the current position <> default, cause a mouseup

If currSplitPosX <> &H7FFFFFFF Then splitter_MouseUp Button, Shift, x, y

'set the current position to the default value

currSplitPosX = &H7FFFFFFF
End If
End Sub

Private Sub splitter_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)

'if the splitter has been moved...

If currSplitPosX& <> &H7FFFFFFF Then

'if the current position <> default, reposition the splitter and set this as the current value

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 Sub

Private Sub splitter_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

'if the splitter has been moved...

If currSplitPosX <> &H7FFFFFFF Then

'if the current position <> the last position do a final move of the splitter

If CLng(x) <> currSplitPosX Then
Splitter.Move Splitter.Left + x, CTRL_OFFSET, SPLT_WDTH, ScaleHeight - _
(CTRL_OFFSET * 2)
End If

'call this the default position

currSplitPosX = &H7FFFFFFF

'restore the normal splitter colour

Splitter.BackColor = &H8000000F

'and check for valid sizings. Either enforce the default minimum &

'maximum widths for the left list, or, if within range, set the width.

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

'reposition both lists, and the splitter bar

Form_Resize

End If
End Sub

'Select the splitter bar on the form, and change it's icon property to 9 -

'Size W E. Then Run the project. When the mouse passes over the splitter bar,

'it will change into a left-right arrow. Click & drag to a new position, and

'release.

Start a new project, and on the form place a list box
(ListLeft), a text box (TextRight), and a picturebox
(Splitter). Place the following code into the general
declarations area of the form to contain the splitter bar:










( splitterbar.html )- by Paolo Puglisi - Modifica del 17/12/2023