* VB-CODE (2)
Tip 138: Enabling and Disabling Scroll Bars in a List Box

July 1, 1995

Abstract
When you write a program in Visual Basic®, it may be necessary to temporarily
enable or disable the scroll bars in a List Box control. This article explains
how to use the Windows® application programming interface (API) GetSystemMetrics
function with a Picture Box control to enable or disable the scroll bars in a List
Box control.

Using the GetSystemMetrics Function
You can use the Windows® application programming interface (API) GetSystemMetrics
function to retrieve the system metrics (for example, the width and height) of
several elements of the Windows environment. To use this function in your Visual
Basic® program, you must include the following Declare statement in the General
Declarations section of your form (note that this Declare statement must be typed
as a single line of code):

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long)
   As Long

The GetSystemMetrics function requires only one argumenta long value specifying
the type of information you want to retrieve. The following table shows the
constant values you must use to obtain the system metrics of a specific element
in the Windows environment:

Const SM_CXSCREEN = 0            Width of screen.
Const SM_CYSCREEN = 1            Height of screen.
Const SM_CXFULLSCREEN = 16       Width of window client area.
Const SM_CYFULLSCREEN = 17       Height of window client area.
Const SM_CYMENU = 15             Height of menu.
Const SM_CYCAPTION = 4           Height of caption or title.
Const SM_CXFRAME = 32            Width of window frame.
Const SM_CYFRAME = 33            Height of window frame.
Const SM_CXHSCROLL = 21          Width of arrow bitmap on horizontal scroll bar.
Const SM_CYHSCROLL = 3           Height of arrow bitmap on horizontal scroll bar.
Const SM_CXVSCROLL = 2           Width of arrow bitmap on vertical scroll bar.
Const SM_CYVSCROLL = 20          Height of arrow bitmap on vertical scroll bar.
Const SM_CXSIZE = 30             Width of bitmaps in title bar.
Const SM_CYSIZE = 31             Height of bitmaps in title bar.
Const SM_CXCURSOR = 13           Width of cursor.
Const SM_CYCURSOR = 14           Height of cursor.
Const SM_CXBORDER = 5            Width of window frame that cannot be sized.
Const SM_CYBORDER = 6            Height of window frame that cannot be sized.
Const SM_CXDOUBLECLICK = 36      Width of rectangle around the location of the
                                 first click. The second click must occur in the
                                 same rectangular location.
Const SM_CYDOUBLECLICK = 37      Height of rectangle around the location of the
                                 first click. The second click must occur in the
                                 same rectangular location.
Const SM_CXDLGFRAME = 7          Width of dialog frame window.
Const SM_CYDLGFRAME = 8          Height of dialog frame window.
Const SM_CXICON = 11             Width of icon.
Const SM_CYICON = 12             Height of icon.
Const SM_CXICONSPACING = 38      Width of rectangles the system uses to position
                                 tiled icons.
Const SM_CYICONSPACING = 39      Height of rectangles the system uses to position
                                 tiled icons.
Const SM_CXMIN = 28              Minimum width of window.
Const SM_CYMIN = 29              Minimum height of window.
Const SM_CXMINTRACK = 34         Minimum tracking width of window.
Const SM_CYMINTRACK = 35         Minimum tracking height of window.
Const SM_CXHTHUMB = 10           Width of scroll box (thumb) on horizontal scroll
                                 bar.
Const SM_CYVTHUMB = 9            Width of scroll box (thumb) on vertical scroll
                                 bar.
Const SM_DBCSENABLED = 42        Returns a nonzero if the current Windows version
                                 uses double-byte characters, otherwise returns
                                 zero.
Const SM_DEBUG = 22              Returns nonzero if the Windows version is a
                                 debugging version.
Const SM_MENUDROPALIGNMENT = 40  Alignment of pop-up menus. If zero, left side is
                                 aligned with corresponding left side of menu bar
                                 item. If nonzero, left side is aligned with right
                                 side of corresponding menu bar item.
Const SM_MOUSEPRESENT = 19       Nonzero if mouse hardware is installed.
Const SM_PENWINDOWS = 41         Handle of Pen Windows dynamic-link library (DLL)
                                 if Pen Windows is installed.
Const SM_SWAPBUTTON = 23         Nonzero if the left and right mouse buttons are
                                 swapped.

In a Visual Basic application, you can selectively enable or disable the scroll
bars in a List Box by first retrieving the width of the scroll bar's arrow bitmap.
You do this by calling the GetSystemMetrics function with the value SM_CXVSCROLL
for the Index argument. The width of the arrow bitmap is returned as a long value
by the GetSystemMetrics function.
Next, a Picture Box control must be positioned directly over the scroll bars on
the window or form in your project. The Width property of the Picture Box is set
to the width of the arrow bitmap. By setting the Visible property of the Picture
Box control to True, the user can employ the scroll bars in the usual manner.
However, if you set the Visible property of the Picture Box control to False, the
user cannot see the scroll bars. Therefore, the scroll bars become temporarily
disabled.

Example Program
This  program shows how to hide the scroll bars of a List Box control.

 1. Create a new project in Visual Basic. Form1 is created by default.
 2. Add the following Constant and Declare statements to the General Declarations
    section of Form1 (note that the Declare statement must be typed as a single
    line of code):

Const SM_CXVSCROLL% = 2
Private Declare Function GetSystemMetrics Lib "user32"
   (ByVal nIndex As Long) As Long

 3. Add the following code to the Form_Load event for Form1:

Private Sub Form_Load()
    Dim WD As Long
    List1.Visible = False
    WD = GetSystemMetrics(SM_CXVSCROLL%)
    Picture1.Width = WD * Screen.TwipsPerPixelX
    Picture1.Left = List1.Left + List1.Width - Picture1.Width
    Picture1.Top = List1.Top
    Picture1.Height = List1.Height
    Picture1.Line (0, 0)-Step(0, Picture1.Height)
    List1.Visible = True
    List1.AddItem "Vancouver"
    List1.AddItem "Seattle"
    List1.AddItem "London"
    List1.AddItem "Paris"
End Sub

 4. Create a new procedure called ShowBar. Add the following code to this
    procedure:

Sub ShowBar()
    Picture1.Visible = False
End Sub

 5. Create a new procedure called HideBar. Add the following code to this
    procedure:

Sub HideBar()
    Picture1.Visible = True
    Picture1.Line (0, 0)-Step(0, Picture1.Height)
End Sub

 6. Add a List Box control to Form1. List1 is created by default. Set the
    following properties for List1:
    Height = 450
    Left = 2760
    Top = 1800
    Width = 1215

 7. Add a Picture Box control to Form1. Picture1 is created by default. Set the
    following properties for Picture1:
    AutoRedraw = True
    BorderStyle = 0-None
    Height = 450
    Left = 2760
    Top = 1800
    Visible = False
    Width = 1215

 8. Add a Command Button control to Form1. Command1 is created by default. Set
    its Caption property to "Show".
 9. Add the following code to the Click event for Command1:

Private Sub Command1_Click()
    ShowBar
End Sub

10. Add a second Command Button control to Form1. Command2 is created by default.
    Set its Caption property to "Hide".
11. Add the following code to the Click event for Command2:

Private Sub Command2_Click()
    HideBar
End Sub

Run the example program by pressing F5. Click the Hide command button. The scroll
bars on the List Box control are no longer visible, but you can still scroll
through the contents of the List Box with the arrow keys. Click the Show command
button to show the scroll bars on the List Box control.

Additional References
"GetSystemMetrics." (Product Documentation, SDKs, Windows 3.1 SDK,
   Programmer's Reference Volume 2: Functions)


Return