|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic List API Routines SendMessage: Display the List Box Horizontal Scroll Bar if Needed |
||
Posted: | Thursday October 7, 1999 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB6, Windows NT4 | |
OS restrictions: | None | |
Author: | VBnet - Randy Birch | |
Related: |
SendMessage: Display the List Box Horizontal Scroll Bar SendMessage: Align List Box Contents Using Tabstops VBnet CoolTabs |
|
Prerequisites |
None. |
|
This
routine takes the basic method used in SendMessage: Display the List Box Horizontal Scroll Bar, adding a new Add method
for list boxes.
By calling AddItemToList, rather than the regular list's AddItem method, the horizontal scrollbar extent is always increased whenever a longer string is added to the control. The current width of the control is stored in the list's Tag property. This provides a simple mechanism to always ensure that the user can scroll across to see the widest list item. To use the demo, type a string into the textbox (or select a list item). Increase its width, and hit Add. |
BAS Module Code |
Place the following code into the general declarations area of a bas module: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Const LB_GETHORIZONTALEXTENT = &H193 Public Const LB_SETHORIZONTALEXTENT = &H194 Public Const DT_CALCRECT = &H400 Public Const SM_CXVSCROLL = 2 Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public Declare Function DrawText Lib "user32" _ Alias "DrawTextA" _ (ByVal hDC As Long, _ ByVal lpStr As String, _ ByVal nCount As Long, _ lpRect As RECT, ByVal _ wFormat As Long) As Long Declare Function GetSystemMetrics Lib "user32" _ (ByVal nIndex As Long) As Long Public Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long |
Form Code |
Add a list (List1), textbox (Text1), label (Label1) and a command button (Command1) to a form, along with the following code: |
|
Option Explicit Private Sub Form_Load() Call AddItemToList(List1, "Ministry of Agriculture and Food") Call AddItemToList(List1, "Ministry of the Attorney General") Call AddItemToList(List1, "Ministry of Community, City and Social Services") Call AddItemToList(List1, "Ministry of Education") Call AddItemToList(List1, "Ministry of the Environment") Call AddItemToList(List1, "Ministry of Health and Long-Term Care") Call AddItemToList(List1, "Ministry of Housing") End Sub Private Sub Command1_Click() Dim newIndex As Long newIndex = AddItemToList(List1, Text1.Text) 'an 'EnsureVisible' method for the listbox List1.TopIndex = newIndex Label1.Caption = "Item " & newIndex & " added" End Sub Private Sub List1_Click() Text1.Text = List1.List(List1.ListIndex) End Sub Private Function AddItemToList(ctl As Control, _ sNewItem As String, _ Optional dwNewItemData As Variant) As Long Dim c As Long Dim rcText As RECT Dim newWidth As Long Dim currWidth As Long Dim sysScrollWidth As Long Dim tmpFontName As String Dim tmpFontSize As Long Dim tmpFontBold As Boolean 'get the current width used If Len(ctl.Tag) > 0 Then currWidth = CLng(ctl.Tag) End If 'determine the needed width for the new item 'save the font properties to tmp variables tmpFontName = Form1.Font.Name tmpFontSize = Form1.Font.Size tmpFontBold = Form1.Font.Bold Form1.Font.Name = List1.Font.Name Form1.Font.Size = List1.Font.Size Form1.Font.Bold = List1.Font.Bold 'get the width of the system scrollbar sysScrollWidth = GetSystemMetrics(SM_CXVSCROLL) 'use DrawText/DT_CALCRECT to determine item length Call DrawText(Form1.hDC, sNewItem, -1&, rcText, DT_CALCRECT) newWidth = rcText.Right + sysScrollWidth 'if this is wider than the current setting, 'tweak the list and save the new horizontal 'extent to the tag property If newWidth > currWidth Then Call SendMessage(List1.hwnd, _ LB_SETHORIZONTALEXTENT, _ newWidth, _ ByVal 0&) ctl.Tag = newWidth End If 'restore the form font properties Form1.Font.Name = tmpFontName Form1.Font.Bold = tmpFontBold Form1.Font.Size = tmpFontSize 'add the items to the control, and 'add the ItemData if supplied ctl.AddItem sNewItem If Not IsMissing(dwNewItemData) Then If IsNumeric(dwNewItemData) Then ctl.ItemData(ctl.newIndex) = dwNewItemData End If End If 'return the new index as the function result AddItemToList = ctl.newIndex End Function |
Comments |
This routine calculates in pixels, and so is
resolution-independent. This routine will produce the exact same results on all display resolutions. That is to say, if a horizontal
scrollbar is needed at 640x480, it will correctly determine if one is needed at 1024x768. If you don't need the functionality shown here, see SendMessage: Display the List Box Horizontal Scroll Bar. |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |