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