Trucos Modificar el número de líneas de un combobox   (2 artículos )

Si en alguna ocasión necesitamos modificar el número de líneas que aparece al desplegar la lista de un combobox podremos hacerlo con el API de Windows :

Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal
x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long,
ByVal bRepaint As Long) As Long

Public Sub SizeCombo(frm As Form, cbo As ComboBox)
' Modificar el tamaño del área desplegable de un combobox
Dim cbo_left As Integer
Dim cbo_top As Integer
Dim cbo_width As Integer
Dim cbo_height As Integer
Dim old_scale_mode As Integer

     ' cambiamos el ScaleMode del formulario a pixels
     old_scale_mode = frm.ScaleMode
     frm.ScaleMode = vbPixels

     ' guardamos los valores actuales del combobox
     cbo_left = cbo.Left
     cbo_top = cbo.Top
     cbo_width = cbo.Width

     ' cambiamos el alto del combo (en este caso para que ocupe hasta el
final del
     ' formulario menos 5 pixels) y restauramos el sistema de coordenadas
del formulario
     cbo_height = frm.ScaleHeight - cbo.Top - 5
     frm.ScaleMode = old_scale_mode

     ' Modificamos el tamaño de la ventana desplegable del combo
     MoveWindow cbo.hwnd, cbo_left, cbo_top, cbo_width, cbo_height, 1
End Sub

Para ejecutarlo simplemente llamamos a la función SizeCombo pasándole el
formulario y el combo

La rutina del ejemplo anterior funciona perfectamente si el combo está en un formulario pero no si estaba dentro de un frame (o de un picture) con lo que las coordenadas del mismo son relativas al frame y no al formulario, no cambian de twips a pixels al cambiar el estilo de coordenadas del formulario, etc.

He modificado la función para que tenga en cuenta esta situación :

Public Sub SizeCombo(frm As Form, cbo As ComboBox)
' Modificar el tamaño del área desplegable de un combobox
Dim cbo_left As Integer
Dim cbo_top As Integer
Dim cbo_width As Integer
Dim cbo_height As Integer
Dim old_scale_mode As Integer

     ' cambiamos el ScaleMode del formulario a pixels
     old_scale_mode = frm.ScaleMode
     frm.ScaleMode = vbPixels

    'si el combo está dentro de un contenedor (picture, frame) tenemos en cuenta las coordenadas del mismo
    'y además las coordenadas del combo estarán en twips y no en pixels
    If Not (TypeOf cbo.Container Is Form) Then
        cbo_left = (cbo.Left / Screen.TwipsPerPixelX)
        cbo_top = (cbo.Top / Screen.TwipsPerPixelY)
        cbo_width = (cbo.Width / Screen.TwipsPerPixelX)
        ' cambiamos el alto del combo (en este caso para que ocupe hasta el final del frm menos 5 pixels)
        cbo_height = frm.ScaleHeight - cbo.Container.Top - cbo_top - 5
    Else
        ' guardamos los valores actuales del combobox
        cbo_left = cbo.Left
        cbo_top = cbo.Top
        cbo_width = cbo.Width
        ' cambiamos el alto del combo (en este caso para que ocupe hasta el final del frm menos 5 pixels)
        cbo_height = frm.ScaleHeight - cbo_top - 5
    End If
     ' restauramos el sistema de coordenadas del formulario
     frm.ScaleMode = old_scale_mode

     ' Modificamos el tamaño de la ventana desplegable del combo
     MoveWindow cbo.hwnd, cbo_left, cbo_top, cbo_width, cbo_height, 1
End Sub



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com