Mensajes correspondientes a la lista

La lista del combo box normalmente se inicializa por la aplicación, y el usuario puede elegir uno de los elementos de la lista, y salvo en el estilo de lista desplegable, también se podrán introducir valores que no estén en la lista.

Añadir ítems

Mediante el envío de un mensaje CB_ADDSTRING podemos añadir cadenas a la lista de un combo box, la dirección de la cadena se envía en el parámetro lParam.

Si el combo box tiene el estilo CBS_SORT, la nueva cadena se inserta en la posición adecuada para mantener el orden alfabético entre los elementos de la lista.

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

El mensaje CB_INSERTSTRING nos permite insertar cadenas en la lista en una posición determinada, independientemetne de que el combo box tenga el estilo CBS_SORT, la cadena siempre se insertará en la posición especificada por el parámetro wParam. La cadena se indica en el parámetro lParam.

  /* Insertar un ítem antes del seleccionado actualmente */
   strcpy(cad, "CADENA INSERTADA");
   SendMessage(hctrl, CB_INSERTSTRING, (WPARAM)3, (LPARAM)cad);

Recuperar información

Los mensajes CB_GETLBTEXT y CB_GETLBTEXTLEN nos sirven para leer cadenas desde la lista de un combo 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 almacena la cadena leída. 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, CB_GETCURSEL, 0, 0);
   l = SendMessage(hctrl, CB_GETLBTEXTLEN, (WPARAM)i, (LPARAM)cad);
   cad = (char*)malloc(l+1);
   SendMessage(hctrl, CB_GETLBTEXT (WPARAM)i, (LPARAM)cad);

El mensaje CB_GETCOUNT no tiene parámetros, y sirve para obtener el número de elementos que contiene la lista de un combo box.

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

Para obtener el índice del ítem actualmente seleccionado en la lista de un combo box, se usa el mensaje CB_GETCURSEL. Este mensaje no precisa parámetros.

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

En el caso de controles combo box con el estilo CBS_DROPDOWN, en general nos interesará recuparar el texto que aparezca en el control de edición. Ya que el usuario puede escribir un texto que no aparece en la lista, recuparar el texto del control de edición asegura que siempre recuperamos el valor introducido por el usuario.

Para recuperar ese valor usaremos el mensaje WM_GETTEXT:

   SendDlgItemMessage(hwnd, ID_COMBO, WM_GETTEXT, 128, (LPARAM)cad);

O bien:

   hctrl = GetDlgItem(hwnd, ID_COMBO);
   SendMessage(hctrl, WM_GETTEXT, 128, (LPARAM)cad);

Recordemos que en parámetro wParam indicaremos la longitud máxima de la cadena a recuperar y en lParam pasaremos un puntero a char, es decir, la dirección donde almacenaremos la cadena.

Cambiar la selección

El mensaje CB_SETCURSEL nos permite seleccionar un ítem, indicado por el parámetro wParam. Además, se elimina cualquier selección previa, y el contenido de la lista se desplaza, si es necesario, para mostrar la nueva cadena seleccionada.

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

El mensaje CB_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, CB_SELECTSTRING, (WPARAM)i, (LPARAM)"E");

Buscar ítems

El mensaje CB_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 la primera cadena que empiece por "EN" */
   int i;
...
   i = SendMessage(hctrl, CB_FINDSTRING, (WPARAM)-1, (LPARAM)"EN");
   SendMessage(hctrl, CB_SETCURSEL, (WPARAM)i, 0);

El mensaje CB_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 "Enero" */
   int i;
...
   i = SendMessage(hctrl, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)"Enero");
   SendMessage(hctrl, CB_SETCURSEL, (WPARAM)i, 0);

En cualquiera de los dos casos, si no se encuentra la cadena buscada, el valor de retorno es CB_ERR.

Borrar ítems

Para eliminar ítems se usa el mensaje CB_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, CB_GETCURSEL, 0, 0);
   SendMessage(hctrl, CB_DELETESTRING, (WPARAM)i, 0);

Mediante el mensaje CB_RESETCONTENT, sin parámetros, podemos vaciar una lista de un combo box por completo.

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

Otros mensajes

El mensaje CB_GETTOPINDEX sirve para recuperar el índice del primer ítem visible de la lista de un combo box. Este mensaje no tiene parámetros.

De forma simética, el mensaje CB_SETTOPINDEX sirve para asegurar que un determinado ítem estará en la parte visible de la lista de un combo box. En el parámetro wParam se indica el índice del ítem que queremos que sea visible.

Mediante el mensaje CB_SHOWDROPDOWN podemos mostrar u ocultar la lista desplegable asociada a un combo box con el estilo CBS_DROPDOWN o CBS_DROPDOWNLIST.

También podemos obtener el estado de la lista desplegable mediante el mensaje CB_GETDROPPEDSTATE. Este mensaje no tiene parámetros, y el valor de retorno indica si la lista está desplegada (TRUE) o plegada (FALSE).

Ejemplo 72


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 72 win072.zip 2007-03-15 3471 bytes 101