Automatically Adding/Hide Horizontal Scroll bar in the ListBox control

Category:
Forms and Controls
Type:
Classes
Difficulty:
Intermediate

Author: 10Tec Company

Version Compatibility: Visual Basic 6, Visual Basic 5

More information:
The code uses the SendMessage API function to add a horizontal scroll bar dynamically to a list box using the LB_SETHORIZONTALEXTENT message. To precisely calculate the width of a new item, our class uses the DrawText API function with the DT_CALCRECT flag. Draw attention at the fact that our class works properly if you change the font of the listbox as you want. We use the IFont interface and its hFont property to retrieve the handle of the font used in the listbox. Our class can also calculate the minimum width of the list box when the horizontal scroll bar disappears (it takes into account the visibility of the vertical scroll bar in the listbox; it determines whether this scroll bar is present by retrieving the listbox style flags and testing these set of flags for WS_VSCROLL).

The code uses the SendMessage API function to add a horizontal scroll bar dynamically to a list box using the LB_SETHORIZONTALEXTENT message. To precisely calculate the width of a new item, our class uses the DrawText API function with the DT_CALCRECT flag. Draw attention at the fact that our class works properly if you change the font of the listbox as you want. We use the IFont interface and its hFont property to retrieve the handle of the font used in the listbox. Our class can also calculate the minimum width of the list box when the horizontal scroll bar disappears (it takes into account the visibility of the vertical scroll bar in the listbox; it determines whether this scroll bar is present by retrieving the listbox style flags and testing these set of flags for WS_VSCROLL).

Using of this class called CListBoxHScroll in real-world applications is very easy. All you need to do is to initialize this class using the Attach method which accepts the reference to the list box you want to populate. Then you can add/remove or change item caption using its methods (AddItem, RemoveItem and so on - like in the standard ListBox control).

To see how this class works, create a new exe project in VB and place the CommandButton and ListBox controls on its form. Don't change the default names of these controls (Command1 and List1 respectively). Put the following code in the Command1_Click event procedure:

Private Sub cmdPopulate_Click()
   Dim LBHS As New CListBoxHScroll
   Dim i As Long, lStrLen As Long
   
   With List1.Font
      .Name = "Arial"
      .Size = 12
      .Italic = True
   End With
   
   LBHS.Attach List1
   
   For i = 1 To 30
      lStrLen = Int(Rnd * 50) + 1
      LBHS.AddItem String(lStrLen, "W") + "!"
   Next
End Sub
Run the project and press the Command1 button. You will see that the listbox named List1 has been populated with 30 random length strings, has the horizontal scroll bar and displays the last added string.

The attached class can be useful in many real-world situations. For instance, if you perform context search in files, you can use this class to add found files to a list box at the screen as they are found. Our company uses this code in demo applications of the xDir library that allows you to enumerate files and folders in a specified folder and all of its subfolders using various filter criteria (file and folder mask; file size; attributes; date and time of creation, last access and modification, etc.) You can visit our Web-site (www.10Tec.com) to download this and other demos to see how it works.

Instructions: Copy the declarations and code below and paste directly into your VB project.

Declarations:

Code: