Rubrik: Controls · ListBox | VB-Versionen: VB4, VB5, VB6 | 28.06.01 |
Horizontaler Scrollbalken in der ListBox Dieser Tipp zeigt, wie man einer ListBox einen horizontalen Scrollbalken hinzufügt - wenn notwendig. | ||
Autor: Dieter Otter | Bewertung: | Views: 19.604 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Warum hat die Standard ListBox eigentlich keinen horizontalen, sondern nur einen vertikalen Scrollbalken? Diese Frage haben sich sicherlich schon viele unter uns gestellt.
Was macht man nun, wenn ein Eintrag innerhalb der ListBox länger ist als die Listbox breit? Nun ja, man fügt mit Hilfe der SendMessage-API Funktion einen horizontalen Scrollbar hinzu - und dasganze nur nach Bedarf!
' zunächst die benötigten API-Deklarationen Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long Private Const LB_SETHORIZONTAL = &H194
Ein Problem gibt's jetzt aber noch: Die SendMessage-Funktion erwartet als dritten Parameter (wParam) die Breite des längsten Eintrags und zwar in der Maßeinheit Pixel!
Die Breite eines Eintrags kann man ja mit der TextWidth-Funktion ermitteln, und in Pixel umrechnen lässt sich dann der Wert per Screen.TwipsPerPixelX. Also erstellen wir und eine Prozedur, in der der längste Eintrag ermittelt wird - und das sieht dann so aus:
' Längsten Eintrag einer ListBox ermitteln ' und als Ergebnis die Breite in Pixel zurückliefern Public Function GetListWidth(Liste As ListBox) As Long Dim I As Integer Dim maxWidth As Long Dim Form As Form ' für "TextWidth" muss die für die ListBox ' verwendete Schrift berücksichtigt werden! Set Form = Me Set Form.Font = List1.Font maxWidth = 0 With Liste For I = 0 To .ListCount - 1 If Form.TextWidth(.List(I)) > maxWidth Then _ maxWidth = Form.TextWidth(.List(I)) Next I End With ' Ergebnis in Pixel umrechnen maxWidth = maxWidth / Screen.TwipsPerPixelX ' kleine Zugabe GetListWidth = maxWidth + 5 End Function
Um nun den Scrollbalken anzuzeigen, muss die SendMessage-Funktion folgendermaßen aufgerufen werden:
' horizontalen Scrollbalken anzeigen Public Sub ListeSetHorizScrollbar(Liste As ListBox) Dim maxWidth As Long maxWidth = GetListWidth(Liste) If maxWidth > List1.Width / Screen.TwipsPerPixelX Then ' nur wenn Eintrag länger ist als die ListBox breit! SendMessage List1.hwnd, LB_SETHORIZONTAL, maxWidth, 0& Else ' Scrollbalken wieder entfernen SendMessage List1.hwnd, LB_SETHORIZONTAL, 0, 0& End If End Sub
Die Prozedur ListeSetHorizScrollbar sollten Sie immer dann aufrufen, wenn der ListBox neue Einträge hinzugefügt oder bestehende Einträge geändert bzw. gelöscht werden, so daß der horizontale Scrollbalken ein- oder ggf. auch wieder ausgeblendet wird.