Scroll Horizontal en ListBox

Este código añade una barra de desplazamiento horizontal en los ListBox. La barra de desplazamiento vertical se activa automáticamente.

Option Explicit
Const LB_SETHORIZONTALEXTENT = &H194

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
             ByVal wParam As Long, lParam As Long) As Long

Private Sub Form_Load()
    Dim iTmp As Long      'Para el valor devuelto por SendMessage
    
    For iTmp = 1 To 20
        List1.AddItem "Texto..."
    Next iTmp
    
    Me.ScaleMode = vbPixels            'wParam es en PIXELS
    iTmp = SendMessage(List1.hwnd, LB_SETHORIZONTALEXTENT, List1.Width, 0&)
End Sub

Una opción más completa puede ser la de recorrer todos los elementos que existen en la lista y comprobar cual es la cadena más larga, para ajustar la longitud de la barra con respecto a la línea más ancha.

El código del formulario, para que inicie al arrancar.

'Es necesario que la propiedad ScaleMode del Formulario
'este en Pixel (3)
Private Sub Form_Load()
    Dim Elemento As Integer
    'Agregandos Item a la lista, para mostrar como funciona
    'la Barra Horizontal.
    For Elemento = 0 To 15
        List1.AddItem Elemento & " Indice " & String(Elemento * 10, "*")
    Next
    'Llama a la funcion para mostrar la Barra Horizontal
    'MostrarBarraHorizontal (Control ListBox),(Formulario)
    MostrarBarraHorizontal Form1.List1, Form1
End Sub

En un módulo incluye la declaración y el procedimiento que calcula el ancho de la barra de desplazamiento.

'Declaración de la API para mostrar la barra de desplazamiento horizontal
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
         ByVal wParam As Long, lParam As Long) As Long

'Declaración de Constantes necesarias
Const WM_USER = &H400
Const LB_SETHORIZONTALEXTENT = WM_USER + 21

'Funcion  para mostrar la Barra horizontal
Sub MostrarBarraHorizontal(Lista As Control, Formulario As Form)
    Dim Resultado As Long, Elemento As Integer, AnchoDeTexto As String
    'Compara el ancho de texto de cada linea del ListBox
    'La variable Elemento% al final del bucle sera
    'igual a la linea mas ancha
    For Elemento = 0 To Lista.ListCount
        If Formulario.TextWidth(Lista.List(Elemento)) > AnchoDeTexto Then 
       AnchoDeTexto = Formulario.TextWidth(Lista.List(Elemento))
        End If
    Next Elemento
    'Llamada al API para mostrar la barra
    Resultado = SendMessage(Lista.hWnd, LB_SETHORIZONTALEXTENT, AnchoDeTexto + 5, 0&)
End Sub
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s