Mensajes más comunes

En el capítulo 8 ya vimos algunos de los mensajes de uso más frecuente en list box, los repasaremos ahora y comentaremos algunos más:

Entre los conocidos, tenemos los siguientes mensajes:

LB_ADDSTRING para añadir cadenas a un list box, la dirección de la cadena se envía en el parámetro lParam.

   sprintf(cad, "NUEVA CADENA");
   SendMessage(hctrl, LB_ADDSTRING, 0, (LPARAM)cad);

El mensaje LB_SELECTSTRING sirve para seleccionar una cadena determinada. En el parámetro wParam se envía el índice en que debe comenzar la búsqueda y en lParam la dirección de la cadena a buscar.

   /* Seleccionar primera cadena que empiece por "E", después del 6º ítem */
   int i=6;
...
   SendMessage(hctrl, LB_SELECTSTRING, (WPARAM)i, (LPARAM)"E");

Para obtener el índice del ítem actualmente seleccionado se usa el mensaje LB_GETCURSEL. Este mensaje no precisa parámetros.

   int i;
...
   i = SendMessage(hctrl, LB_GETCURSEL, 0, 0);

Los mensajes LB_GETTEXT y LB_GETTEXTLEN nos sirven para leer cadenas desde un list box. Para el primero se indica en el parámetro wParam el índice del ítem a recuperar, y en lParam la dirección del buffer donde se lee la cadena. El segundo mensaje nos sirve para obtener la longitud de la cadena de un ítem, indicado mendiante su índice en el parámetro wParam.

   /* Obtener cadena seleccionada */
   int i, l;
   char *cad;
...
   i = SendMessage(hctrl, LB_GETCURSEL, 0, 0);
   l = SendMessage(hctrl, LB_GETTEXTLEN, (WPARAM)i, (LPARAM)cad);
   cad = (char*)malloc(l+1);
   SendMessage(hctrl, LB_GETTEXT, (WPARAM)i, (LPARAM)cad);

Pero existen otros mensajes que suelen ser muy útiles a la hora de usar list boxes:

Por ejemplo, podemos eliminar líneas mediante el mensaje LB_DELETESTRING, en el que indicaremos en el parámetro wParam el valor del índice a eliminar.

   /* Eliminar cadena actualmente seleccionada */
   int i;
...
   i = SendMessage(hctrl, LB_GETCURSEL, 0, 0);
   SendMessage(hctrl, LB_DELETESTRING, (WPARAM)i, 0);

El mensaje LB_FINDSTRING nos permite buscar una cadena que coincida con el prefijo especificado en el parámetro lParam, a partir del índice indicado en wParam.

   /* Seleccionar siguiente cadena, a partir de la 
    seleccionada actualmente, que empiece por "CO" */
   int i;
...
   i = SendMessage(hctrl, LB_GETCURSEL, 0, 0);
   i = SendMessage(hctrl, LB_FINDSTRING, (WPARAM)i, (LPARAM)"CO");
   SendMessage(hctrl, LB_SETCURSEL, (WPARAM)i, 0);

El mensaje LB_FINDSTRINGEXACT es parecido, pero no usa el parámetro lParam como un prefijo, sino que busca una cadena que coincida exactamente con ese parámetro.

   /* Seleccionar la cadena igual a "Portugal" */
   int i;
...
   i = SendMessage(hctrl, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)"Portugal");
   SendMessage(hctrl, LB_SETCURSEL, (WPARAM)i, 0);

El mensaje LB_GETCOUNT no tiene parámetros, y sirve para obtener el número de elementos que contiene un list box.

   /* Obtener número de ítems */
   int i;
...
   i = SendMessage(hctrl, LB_GETCOUNT, 0, 0);
   sprintf(cad, "Número de ítems: %d", i);
   MessageBox(hwnd, cad, "List Box", MB_OK);

LB_GETTOPINDEX tampoco tiene parámetros, y sirve para recuperar el índice del primer ítem visible de un list box.

   /* Indice de primer ítem visible */
   int i;
...
   i = SendMessage(hctrl, LB_GETTOPINDEX, 0, 0);
   sprintf(cad, "Pimer ítem visible: %d", i);
   MessageBox(hwnd, cad, "List Box", MB_OK);

LB_INSERTSTRING nos permite insertar un ítem en una posición determinada por el valor del parámetro wParam, y con el texto indicado en lParam. Esta inserción se hace en la posición indicada, aunque la lista tenga el estilo LBS_SORT.

   /* Insertar un ítem antes del seleccionado actualmente */
   int i;
...
   sprintf(cad, "CADENA INSERTADA");
   i = SendMessage(hctrl, LB_GETCURSEL, 0, 0);
   SendMessage(hctrl, LB_INSERTSTRING, (WPARAM)i, (LPARAM)cad);

Mediante el mensaje LB_RESETCONTENT, sin parámetros, podemos vaciar un list box por completo.

   /* Vaciar list box */
   SendMessage(hctrl, LB_RESETCONTENT, 0, 0);

El mensaje LB_SETCURSEL nos permite seleccionar un ítem, indicado en el parámetro wParam. Además, se elimina la selección previa, y el contenido del list box se desplaza, si es necesario, para mostrar la nueva cadena seleccionada.

   /* Seleccionar ítem siguiente al actual */
   int i;
...
   i = SendMessage(hctrl, LB_GETCURSEL, 0, 0);
   SendMessage(hctrl, LB_SETCURSEL, (WPARAM)i+1, 0);

Si queremos asegurar que un ítem determinado será visible, sin seleccionarlo, podemos usar el mensaje LB_SETTOPINDEX, indicando en el parámetro wParam el índice del ítem a visualizar.

   /* Asegurarse de que el ítem 18 es visible */
   SendMessage(hctrl, LB_SETTOPINDEX, (WPARAM)18, 0);

Ejemplo 57


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 57 win057.zip 2007-03-15 3854 bytes 116