The ScrollBar is a commonly used control, which enables the user to select
a value by positioning it at the desired location. It represents a set of values.
The Min and Max property represents the minimum and maximum value. The value property
of the ScrollBar represents its current value, that may be any integer between
minimum and maximum values assigned.
The HScrollBar and the VScrollBar controls are perfectly identical, apart from
their different orientation. After you place an instance of such a control on
a form, you have to worry about only a few properties: Min and Max represent the
valid range of values, SmallChange is the variation in value you get when clicking
on the scroll bar's arrows, and LargeChange is the variation you get when you
click on either side of the scroll bar indicator. The default initial value for
those two properties is 1, but you'll probably have to change LargeChange to a
higher value. For example, if you have a scroll bar that lets you browse a portion
of text, SmallChange should be 1 (you scroll one line at a time) and LargeChange
should be set to match the number of visible text lines in the window.
The most important run-time property is Value, which always returns the relative
position of the indicator on the scroll bar. By default, the Min value corresponds
to the leftmost or upper end of the control:
' Move the indicator near the top (or left) arrow.
VScroll1.Value = VScroll1.Min
' Move the indicator near the bottom (or right) arrow.
VScroll1.Value = VScroll1.Max
While this setting is almost always OK for horizontal scroll bars, you might
sometimes need to reverse the behavior of vertical scroll bars so that the zero
is near the bottom of your form. This arrangement is often desirable if you want
to use a vertical scroll bar as a sort of slider. You obtain this behavior by
simply inverting the values in the Min and Max properties. (In other words, it's
perfectly legal for Min to be greater than Max.)
There are two key events for scrollbar controls: the Change event fires when
you click on the scroll bar arrows or when you drag the indicator; the Scroll
event fires while you drag the indicator. The reason for these two distinct possibilities
is mostly historical. First versions of Visual Basic supported only the Change
event, and when developers realized that it wasn't possible to have continuous
feedback when users dragged the indicator, Microsoft engineers added a new event
instead of extending the Change event. In this way, old applications could be
recompiled without unexpected changes in their behavior. At any rate, this means
that you must often trap two distinct events:
' Show the current scroll bar's value.
Private VScroll1_Change()
Label1.Caption = VScroll1.Value
End Sub
Private VScroll1_Scroll()
Label1.Caption = VScroll1.Value
End Sub
The example shown in the following figure uses three VScrollBar controls as
sliders to control the individual RGB (red, green, blue) components of a color.
The three scroll bars have their Min property set to 255 and their Max property
set to 0, while their SmallChange is 1 and LargeChange is 16. This example is
also a moderately useful program in itself because you can select a color and
then copy its numeric value to the clipboard and paste it in your application's
code as a decimal value, a hexadecimal value, or an RGB function.

Use scrollbar controls to visually create colors.
Scrollbar controls can receive the input focus, and in fact they support both
the TabIndex and TabStop properties. If you don't want the user to accidentally
move the input focus on a scrollbar control when he or she presses the Tab key,
you must explicitly set its TabStop property to False. When a scrollbar control
has the focus, you can move the indicator using the Left, Right, Up, Down, PgUp,
PgDn, Home, and End keys. For example, you can take advantage of this behavior
to create a read-only TextBox control with a numeric value that can be edited
only through a tiny companion scroll bar. This scroll bar appears to the user
as a sort of spin button, as you can see in the figure below. To make the trick
work, you need to write just a few lines of code:
Private Sub Text1_GotFocus()
' Pass the focus to the scroll bar.
VScroll1.SetFocus
End Sub
Private Sub VScroll1_Change()
' Scroll bar controls the text box value.
Text1.Text = VScroll1.Value
End Sub

You don't need external ActiveX controls to create functional spin buttons
Scrollbar controls are even more useful for building scrolling forms, like
the one displayed in Figure 3-15. To be certain, scrolling forms aren't the most
ergonomic type of user interface you can offer to your customers: If you have
that many fields in a form, you should consider using a Tab control, child forms,
or some other custom interface. Sometimes, however, you badly need scrollable
forms, and in this situation you are on your own because Visual Basic forms don't
support scrolling.
Fortunately, it doesn't take long to convert a regular form into a scrollable
one. You need a couple of scrollbar controls, plus a PictureBox control that you
use as the container for all the controls on the form, and a filler control—a
CommandButton, for example—that you place in the bottom-right corner of
the form when it displays the two scroll bars. The secret to creating scrollable
forms is that you don't move all the child controls one by one. Instead, you place
all the controls in the PictureBox control (named picCanvas in the following code),
and you move it when the user acts on the scroll bar:
Sub MoveCanvas()
picCanvas.Move -HScroll1.Value, -VScroll1.Value
End Sub
In other words, to uncover the portion of the form near the right border, you
assign a negative value to the PictureBox's Left property, and to display the
portion near the form's bottom border you set its Top property to a negative value.
It's really that simple. You do this by calling the MoveCanvas procedure from
within the scroll bars' Change and Scroll events. Of course, it's critical that
you write code in the Form_Resize event, which makes a scroll bar appear and disappear
as the form is resized, and that you assign consistent values to Max properties
of the scrollbar controls:
' size of scrollbars in twips
Const SB_WIDTH = 300 ' width of vertical scrollbars
Const SB_HEIGHT = 300 ' height of horizontal scrollbars
Private Sub Form_Resize()
' Resize the scroll bars along the form.
HScroll1.Move 0, ScaleHeight - SB_HEIGHT, ScaleWidth - SB_WIDTH
VScroll1.Move ScaleWidth - SB_WIDTH, 0, SB_WIDTH, _
ScaleHeight - SB_HEIGHT
cmdFiller.Move ScaleWidth - SB_WIDTH, ScaleHeight - SB_HEIGHT, _
SB_WIDTH, SB_HEIGHT
' Put these controls on top.
HScroll1.ZOrder
VScroll1.ZOrder
cmdFiller.ZOrder
picCanvas.BorderStyle = 0
' A click on the arrow moves one pixel.
HScroll1.SmallChange = ScaleX(1, vbPixels, vbTwips)
VScroll1.SmallChange = ScaleY(1, vbPixels, vbTwips)
' A click on the scroll bar moves 16 pixels.
HScroll1.LargeChange = HScroll1.SmallChange * 16
VScroll1.LargeChange = VScroll1.SmallChange * 16
' If the form is larger than the picCanvas picture box,
' we don't need to show the corresponding scroll bar.
If ScaleWidth < picCanvas.Width + SB_WIDTH Then
HScroll1.Visible = True
HScroll1.Max = picCanvas.Width + SB_WIDTH - ScaleWidth
Else
HScroll1.Value = 0
HScroll1.Visible = False
End If
If ScaleHeight < picCanvas.Height + SB_HEIGHT Then
VScroll1.Visible = True
VScroll1.Max = picCanvas.Height + SB_HEIGHT - ScaleHeight
Else
VScroll1.Value = 0
VScroll1.Visible = False
End If
' Make the filler control visible only if necessary.
cmdFiller.Visible = (HScroll1.Visible Or VScroll1.Visible)
MoveCanvas
End Sub
Working with scrollable forms at design time isn't comfortable. I suggest that
you work with a maximized form and with the PictureBox control sized as large
as possible. When you're finished with the form interface, resize the PictureBox
control to the smallest area that contains all the controls, and then reset the
form's WindowState property to 0-Normal.
See Also