Trucos Mostrar las entradas largas de un ListBox como ToolTips   (2 artículos )

Algunas veces los datos que hay en una lista son demasiado largos para el tamaño del ListBox. Cuando esto sucede se puede emplear un código bastante simple para mostrar las entradas del listbox como ToolTips cuando pasas el ratón sobre el ListBox.

En un formulario añadimos un ListBox y declaramos :

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_ITEMFROMPOINT = &H1A9


Añadimos algo de código en el load del formulario para rellenar el ListBox :

Private Sub Form_Load()
    '
    With List1
        .AddItem "Michael Clifford Amundsen"
        .AddItem "Walter P.K. Smithworthy, III"
        .AddItem "Alicia May Sue McPherson-Pennington"
    End With
    '
End Sub

Finalmente, en el evento MouseMove del ListBox ponemos el siguiente código :

Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    '
    ' presentar el mensaje
    '
    Dim lXPoint As Long
    Dim lYPoint As Long
    Dim lIndex As Long
    '
    If Button = 0 Then ' si no hay ningún botón presionado
        lXPoint = CLng(X / Screen.TwipsPerPixelX)
        lYPoint = CLng(Y / Screen.TwipsPerPixelY)
        '
        With List1
            ' coger el elemento seleccionado de la lista
            lIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, ByVal ((lYPoint * 65536) + lXPoint))
            ' mostrar el mensaje o borrar el anterior
            If (lIndex >= 0) And (lIndex <= .ListCount) Then
                .ToolTipText = .List(lIndex)
            Else
                .ToolTipText = ""
            End If
        End With '(List1)
    End If '(button=0)
    '
End Sub

From--Matt Vandenbush [matt_vandenbush@whbrady.com]

Una mejora muy sencilla sería sacar el ToolTip sólo cuando el texto no cabe en el ListBox. Para ello el código del evento MouseMove debe quedar :

            ' mostrar el mensaje o borrar el anterior
            If (lIndex >= 0) And (lIndex <= .ListCount) Then
                'mirar si el texto no cabía
                If TextWidth(.List(lIndex)) > .Width Then
                    .ToolTipText = .List(lIndex)
                Else
                    .ToolTipText = ""
                End If
            Else
                .ToolTipText = ""
            End If

Estamos suponiendo que el ListBox y el formulario tienen el mismo tipo de letra. Si esto no fuera así podemos añadir un PictureBox con el mismo tipo de letra que el ListBox y calcular el ancho del texto mediante Picture1.TextWidth(.List(lIndex)).

José Rubí : jrubi@arrakis.es , http://www.arrakis.es/~jrubi

Una manera más o menos sencilla de simular esa especie de ToolTip que sale, por ejemplo en el explorador de windows, sobre los literales que son demasiado largos para que se puedan ver completos es :

Creamos un formulario con un listbox, y un picturebox, éste con la propiedad Visible = false y la BackColor = &H80000018&.

Declaramos en el formulario :

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_ITEMFROMPOINT = &H1A9
Dim lIndex As Long

En el evento MouseMove del ListBox :

Dim Alto As Single, Ancho As Single, PosX As Single, PosY As Single
 '
    ' presentar el mensaje
    '
    Dim lXPoint As Long
    Dim lYPoint As Long

    '
    If Button = 0 Then ' si no hay ningún botón presionado
        lXPoint = CLng(X / Screen.TwipsPerPixelX)
        lYPoint = CLng(Y / Screen.TwipsPerPixelY)
        '
        With List2
            ' coger el elemento seleccionado de la lista
            lIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, ByVal ((lYPoint * 65536) + lXPoint))
            ' mostrar el mensaje o borrar el anterior
            If (lIndex >= 0) And (lIndex <= .ListCount) Then
                'mirar si el texto no cabía
                Ancho = TextWidth(.List(lIndex))
                If Ancho > .Width Then
                    Alto = TextHeight(.List(lIndex))
                    Picture1.Move List2.Left + 50, List2.Top + (Alto * (lIndex - List2.TopIndex)) + 20, Ancho + 50, Alto + 50
                    Picture1.ZOrder
                    Picture1.Visible = True
                    Picture1.Cls
                    DoEvents
                    Picture1.Print .List(lIndex)
                    Picture1.Visible = True
                Else
                    Picture1.Visible = False
                End If
            Else
                Picture1.Visible = False
            End If
        End With '(List2)
    End If '(button=0)


En el evento MouseMove del formulario :

Picture1.Visible = False

En el evento Click del PictureBox :

List2.ListIndex = lIndex

En el evento DblClick del PictureBox :

Picture1.Visible = False
List2_DblClick

José Rubí : jrubi@arrakis.es, http://www.arrakis.es/~jrubi



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com