Cómo usar la función SendMessage para mejorar el control de combo box en interfaces

Intentas incorporar diversas facilidades en tus interfaces para hacer la vida más fácil a tus usuarios, y parte de la funcionalidad puede ser bastante compleja. Pero incluso una pequeña mejora puede ser rentable en términos de eficiencia y facilidad de uso. Un buen ejemplo es el control del combo box. ¿Por qué hacer que los usuarios escriban toda una palabra o naveguen por una larga lista de elementos para seleccionar una entrada? Puedes usar un pequeño truco para hacer que el elemento aparezca tan pronto como empiecen a escribir una palabra que esté en el combo box.

Índice de Contenido
  1. El uso de la función API SendMessage
    1. Un vistazo a la API
  2. Poniendo en práctica la función SendMessage
  3. SendMessage en acción

El uso de la función API SendMessage

Esta artículo te mostrará cómo utilizar la función API SendMessage para dotar a tus controles de combo box de esta capacidad. Como refinamiento adicional, ajustaremos el ancho del control para que se adapte al elemento que está mostrando.

Un vistazo a la API

La función SendMessage se utiliza para enviar un mensaje a una ventana (control) llamando directamente a la función de Windows correspondiente a esa ventana. La función de la ventana no devuelve un valor hasta que ha terminado de ejecutarse y puede pasar un valor a la rutina que ha solicitado la llamada. El significado de este valor depende del mensaje. La función SendMessage debe utilizarse en situaciones en las que se desea enviar un mensaje que devuelva un valor.

La función SendMessage acepta cuatro parámetros: un identificador de ventana (Hwnd), un número de mensaje (wMsg), wParam y lParam, y devuelve un valor long. Dado que SendMessage llama directamente a una función de ventana, esta función puede devolver un valor que aparecerá como resultado de la función SendMessage.

ParámetroTipoDescripción
HwndLongIdentificador de la ventana que debe recibir el mensaje
wMsgLongEl mensaje que se enviará
wParamLongEspecifica información adicional; depende del mensaje
lParamLongEspecifica información adicional; depende del mensaje

Una declaración VB de la API SendMessage se vería así:

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

La función puede utilizarse con Windows NT/2000/XP (Windows NT 3.1 y versiones posteriores) y Windows 95/98/Me (Windows 95 y versiones posteriores).

Cuál es el lenguaje de programación preferido para .NET

Poniendo en práctica la función SendMessage

Creemos un proyecto VB simple para mostrar cómo puedes utilizar la API SendMessage para implementar búsquedas inteligentes en tus controles de combo box.

En primer lugar, abre VB, crea un nuevo proyecto y establece la propiedad ScaleMode del formulario en 4 - Character.

A continuación, añade dos etiquetas a tu formulario y establece su propiedad Caption en "Seleccionar Profesión" y "Seleccionar Ciudad". Agrega dos combo boxes a tu formulario y llámalos cboProfesion y cboCiudad. Establece su propiedad Style como Dropdown Combo y haz que el ancho de ambos combo boxes sea pequeño. En este punto, tu pantalla debería parecerse a la Figura A.

Cómo usar la función SendMessage para mejorar el control de combo box en interfaces - Desarrollo | Imagen 1 Newsmatic
Figura A
Ejemplo de combo box

Ahora, añade el siguiente código a la sección de declaración del formulario:

Option Explicit
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 CB_ERR = (-1)
Private Const CB_FINDSTRING = &H14C

Agrega el siguiente código al evento Form_Load():

Private Sub Form_Load()
  Call FillCities 'Rellenar combo box cboCiudad
  Call FillProfessions 'Rellenar combo box cboProfesion
End Sub

Agrega el siguiente código al evento cboCiudad_KeyPress():

Cómo alternar los colores de las filas en un control de cuadrícula
Private Sub cboCiudad_KeyPress(KeyAscii As Integer)
  Call SelectItem(cboCiudad, KeyAscii)
End Sub

Agrega el siguiente código al evento cboProfession_KeyPress():

Private Sub cboProfession_KeyPress(KeyAscii As Integer)
  Call SelectItem(cboProfession, KeyAscii)
End Sub

Agrega las siguientes tres procedimientos al código:

Private Sub SelectItem(cbo As ComboBox, KeyAscii As Integer)
Private Sub FillProfessions()
Private Sub FillCities()

Agrega el código mostrado en el Listado A a SelectItem, agrega el código mostrado en el Listado B a FillProfessions, y agrega el código mostrado en el Listado C a FillCities.

Cuando presiones [Ctrl][F5] para ejecutar el proyecto, tu pantalla debería verse algo como la Figura B.

Cómo usar la función SendMessage para mejorar el control de combo box en interfaces - Desarrollo | Imagen 2 Newsmatic
Figura B
Salida de ejemplo

SendMessage en acción

Para probar la funcionalidad, haz clic en el combo box superior y escribe la letra "b". Deberías ver que aparece la entrada "Banker" en el combo box. Vuelve al principio de la línea y escribe la letra "c". Debería aparecer la entrada "CEO". El mismo truco funcionará para el segundo combo box. Escribe la letra "n", y aparecerá la entrada "New Orleans", pero si continúas escribiendo "New y", aparecerá "New York" en el combo box.

En este ejemplo, utilizamos la función SendMessage API para ayudar a los usuarios a seleccionar elementos de los combo boxes, realizando un ajuste dinámico del ancho para asegurarnos de que ningún elemento se corte.

Cómo utilizar Perl para mejorar tus tareas de línea de comandos en UNIX

Para lograr esta funcionalidad, utilizamos un evento KeyPress para implementar la función de búsqueda inteligente, comprobando si el valor ASCII del carácter introducido es alfanumérico y evitando que los usuarios introduzcan otros caracteres como el signo de dólar, más o menos, el símbolo de porcentaje, etc.

Guardamos los caracteres que el usuario introduce en la variable sFindString y llamamos a la función API SendMessage para buscar un elemento que coincida con lo que el usuario ha introducido. Si se encuentra el elemento, CB_FINDSTRING devuelve el número del elemento que coincide, y establecemos el control del combo box para mostrar el elemento.

También especificamos la propiedad ScaleMode del formulario (una propiedad que permite establecer un valor que indica la unidad de medida para el objeto) como "Character" para asegurarnos de que el ancho de los combo boxes en el formulario se mida en "caracteres" y no en "twips". Luego, simplemente averiguamos la longitud en caracteres del elemento más largo de cada combo box y utilizamos ese valor para especificar la propiedad Width de los controles.

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Desarrollo, allí encontraras muchos artículos similares a Cómo usar la función SendMessage para mejorar el control de combo box en interfaces , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.