
28/08/2007, 00:45
|
| | Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 19 años, 4 meses Puntos: 13 | |
Re: mostrar el contenido completo de un texto en un combo box Hola
El combo no tiene una propiedad para ello, pero con las siguientes API s puedes realizarlo. Añade todo este código a un módulo en tu proyecto (tal cual esta, copiar y pegar en el módulo)
Código:
'Code
'Written by JANO [email protected]
'==========PARA AJUSTAR EL ANCHO DE LA SELECCIÓN DEL COMBO AL TEXTO==========
Option Explicit
Public Declare Function SendMessageLong Lib _
"user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Const CB_GETLBTEXTLEN = &H149
Public Const CB_SETDROPPEDWIDTH = &H160
Public Const ANSI_VAR_FONT = 12
Type SIZE
cx As Long
cy As Long
End Type
Declare Function SelectObject Lib "gdi32" _
(ByVal hDc As Long, ByVal hObject As Long) As Long
Declare Function GetTextExtentPoint32 Lib "gdi32" _
Alias "GetTextExtentPoint32A" _
(ByVal hDc As Long, _
ByVal lpsz As String, _
ByVal cbString As Long, _
lpSize As SIZE) As Long
Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDc As Long) As Long
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
' Esta función calcula el ancho promedio de los caracteres,
' de acuerdo al tipo de letra del formulario
Public Function GetFontDialogUnits(frm As Form) As Long
Dim hFont As Long
Dim hFontOld As Long
Dim r As Long
Dim avgWidth As Long
Dim hDc As Long
Dim tmp As String
Dim sz As SIZE
'guardamos el hdc del formulario
hDc = GetDC(frm.hwnd)
'recibimos los atributos del tipo de letra actual
hFont = GetStockObject(ANSI_VAR_FONT)
hFontOld = SelectObject(hDc, hFont&)
'calculamos su longitud y calculamos el ancho promedio de cada caráter
tmp = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
r = GetTextExtentPoint32(hDc, tmp, 52, sz)
avgWidth = (sz.cx \ 52)
'seleccionamos otra vez el anterior tipo de letra y eliminamos/liberamos el hdc anterior
r = SelectObject(hDc, hFontOld)
r = DeleteObject(hFont)
r = ReleaseDC(frm.hwnd, hDc)
'retornamos el valor obtenido
GetFontDialogUnits = avgWidth
End Function
' Procedimiento que ajusta el ancho del Dropdown de un Combobox de acuerdo a su contenido
' Uselo cuando esté seguro de que el contenido va ser más ancho que el combobox
Public Sub ComboAutoSize(frm As Form, cbo As ComboBox)
Dim r As Long
Dim i As Long
Dim NumOfChars As Long
Dim LongestComboItem As Long
Dim avgCharWidth As Long
Dim NewDropDownWidth As Long
'evaluamos cada entrada del Comoboentries, y usando SendMessageLong
'con CB_GETLBTEXTLEN determinamos la longitud del elemento
'en la porción dropdown del combo
For i = 0 To cbo.ListCount - 1
NumOfChars = SendMessageLong(cbo.hwnd, CB_GETLBTEXTLEN, i, 0)
If NumOfChars > LongestComboItem Then LongestComboItem = NumOfChars
Next
'calculamos la longitud promedio de los carateres usando
'la función GetFontDialogUnits. Como el tipo de letra usado en
'GetFontDialogUnits es ficticio (es otro), el valor de avgCharWidth es sólo
'una aproximación basada en la cadena utilizada
avgCharWidth = GetFontDialogUnits(frm)
'El tamaño del dropdown es acomodado a la cadena más larga.
NewDropDownWidth = (LongestComboItem - 6) * avgCharWidth
'ahora cambiamos el tamaño de porción DropDown del combobox
r = SendMessageLong(cbo.hwnd, CB_SETDROPPEDWIDTH, NewDropDownWidth, 0)
End Sub
Como puedes ver el código no es mio, lo pongo tal cual como yo lo baje de internet, conservando el nombre del autor. Para utilizar el código solo tienes que poner en el Form_Activate del Formulario que contiene el combo la siguiente llamada:
Código:
ComboAutoSize NombreForm, NombreCombo
--Saludos-- |