Acerca de los cuadros combinados

Un cuadro combinado combina un cuadro de edición o texto estático y una lista.

En este tema se incluyen las siguientes secciones.

Estilos y tipos de cuadro combinado

Un cuadro combinado consta de una lista y un campo de selección. La lista presenta las opciones que un usuario puede seleccionar y el campo de selección muestra la selección actual. Si el campo de selección es un control de edición, el usuario puede escribir información no disponible en la lista; de lo contrario, el usuario solo puede seleccionar elementos de la lista.

La biblioteca de controles comunes incluye tres estilos principales del cuadro combinado, como se muestra en la tabla siguiente.

Tipo de cuadro combinado Constante style Descripción
Simple CBS_SIMPLE Muestra la lista en todo momento y muestra el elemento seleccionado en un control de edición.
Drop-down CBS_DROPDOWN Muestra la lista cuando se hace clic en el icono y muestra el elemento seleccionado en un control de edición.
Lista desplegable (lista desplegable) CBS_DROPDOWNLIST Muestra la lista cuando se hace clic en el icono y muestra el elemento seleccionado en un control estático.

 

Las capturas de pantalla siguientes muestran cada uno los tres tipos de cuadro combinado, ya que pueden aparecer en Windows Vista. En la primera captura de pantalla, el usuario ha seleccionado un elemento en el cuadro combinado simple. El usuario también puede escribir un nuevo valor en el cuadro de edición de este control. La lista se ha dimensionado en el editor de recursos de Microsoft Visual Studio y solo es lo suficientemente grande como para dar cabida a dos elementos.

captura de pantalla que muestra un elemento seleccionado en un cuadro combinado simple

En la segunda captura de pantalla, el usuario ha escrito nuevo texto en el control de edición del cuadro combinado desplegable. El usuario también podría haber seleccionado un elemento existente. El cuadro de lista se expande para acomodar tantos elementos como sea posible.

captura de pantalla que muestra el texto escrito en un cuadro combinado desplegable

En la tercera captura de pantalla, el usuario ha abierto el cuadro combinado de lista desplegable. El cuadro de lista se expande para acomodar tantos elementos como sea posible. El usuario no puede escribir texto nuevo.

captura de pantalla que muestra un elemento seleccionado en un cuadro combinado de lista desplegable

También hay una serie de estilos de cuadro combinado que definen propiedades específicas. Los estilos de cuadro combinado definen propiedades específicas de un cuadro combinado. Puede combinar estilos; Sin embargo, algunos estilos solo se aplican a determinados tipos de cuadro combinado. Para obtener una tabla de estilos de cuadro combinado, vea Estilos de cuadro combinado.

Nota

Para usar estilos visuales con cuadros combinados, una aplicación debe incluir un manifiesto y llamar a InitCommonControls al principio del programa. Para obtener información sobre los estilos visuales, vea Estilos visuales. Para obtener información sobre los manifiestos, consulte Habilitación de estilos visuales.

 

Lista de cuadros combinados

La lista es la parte de un cuadro combinado que muestra los elementos que un usuario puede seleccionar. Normalmente, una aplicación inicializa el contenido de la lista cuando crea un cuadro combinado. Cualquier elemento de lista seleccionado por el usuario es la selección actual. No se pueden seleccionar varios elementos. En cuadros combinados simples y desplegables, el usuario puede escribir en el campo de selección en lugar de seleccionar un elemento de lista. En estos casos, no hay ninguna selección actual y es responsabilidad de la aplicación agregar el elemento a la lista y convertirlo en la selección actual, si es adecuado hacerlo.

En esta sección se describen los temas siguientes:

Selección actual

La selección actual es un elemento de lista que el usuario ha seleccionado; el texto seleccionado aparece en el campo de selección del cuadro combinado. Sin embargo, en el caso de un cuadro combinado simple o un cuadro combinado desplegable, la selección actual es solo una forma de entrada de usuario posible en un cuadro combinado. El usuario también puede escribir texto en el campo de selección.

La selección actual se identifica mediante el índice de base cero del elemento de lista seleccionado. Una aplicación puede establecerla y recuperarla en cualquier momento. El procedimiento de ventana o cuadro de diálogo primario recibe una notificación cuando el usuario cambia la selección actual de un cuadro combinado. La ventana principal o el cuadro de diálogo no se notifica cuando la aplicación cambia la selección.

Cuando se crea un cuadro combinado, no hay ninguna selección actual. Esto también es cierto para un cuadro combinado simple o desplegable, si el usuario ha editado el contenido del campo de selección. Para establecer la selección actual, una aplicación envía el mensaje CB_SETCURSEL al cuadro combinado. Una aplicación también puede usar el mensaje CB_SELECTSTRING para establecer la selección actual en un elemento de lista cuya cadena comienza con una cadena especificada. Para determinar la selección actual, una aplicación envía el mensaje CB_GETCURSEL al cuadro combinado. Si no hay ninguna selección actual, este mensaje devuelve CB_ERR.

Cuando el usuario cambia la selección actual en un cuadro combinado, la ventana primaria o el procedimiento de cuadro de diálogo recibe un mensaje de WM_COMMAND con el código de notificación CBN_SELCHANGE en la palabra de orden superior del parámetro wParam . Este código de notificación no se envía cuando la selección actual se establece mediante el mensaje CB_SETCURSEL .

Un cuadro combinado desplegable o un cuadro de lista desplegable envía el código de notificación de CBN_CLOSEUP a la ventana principal o al procedimiento de cuadro de diálogo cuando se cierra la lista desplegable. Si el usuario cambió la selección actual, el cuadro combinado también envía el código de notificación CBN_SELCHANGE cuando se cierra la lista desplegable. Para ejecutar un proceso específico cada vez que el usuario selecciona un elemento de lista, puede controlar el CBN_SELCHANGE o CBN_CLOSEUP código de notificación. Normalmente, esperaría al código de notificación de CBN_CLOSEUP antes de procesar un cambio en la selección actual. Esto puede ser especialmente importante si se requiere una cantidad significativa de procesamiento.

Una aplicación también podría procesar los códigos de notificación CBN_SELENDOK y CBN_SELENDCANCEL . El sistema envía CBN_SELENDOK cuando el usuario selecciona un elemento de lista, o selecciona un elemento y, a continuación, cierra la lista. Esto indica que el usuario ha finalizado y que se debe procesar la selección. CBN_SELENDCANCEL se envía cuando el usuario selecciona un elemento, pero luego selecciona otro control, presiona ESC mientras la lista desplegable está abierta o cierra el cuadro de diálogo. Esto indica que se debe omitir la selección del usuario. CBN_SELENDOK se envía antes de cada mensaje de CBN_SELCHANGE .

En un cuadro combinado simple, el sistema envía el código de notificación CBN_DBLCLK cuando el usuario hace doble clic en un elemento de lista. En un cuadro combinado desplegable o una lista desplegable, un solo clic oculta la lista, por lo que no es posible hacer doble clic en un elemento.

Ciertas notificaciones y mensajes solo se aplican a cuadros combinados que contienen listas desplegables. Cuando se abre o cierra una lista desplegable, la ventana primaria de un cuadro combinado recibe una notificación en forma de mensaje de WM_COMMAND . Si se abre la lista, se CBN_DROPDOWN la palabra de orden superior de wParam. Si se cierra la lista, se CBN_CLOSEUP.

Una aplicación puede abrir la lista de un cuadro combinado desplegable o un cuadro de lista desplegable mediante el mensaje CB_SHOWDROPDOWN . Puede determinar si la lista está abierta mediante el mensaje CB_GETDROPPEDSTATE y puede determinar las coordenadas de una lista desplegable mediante el mensaje CB_GETDROPPEDCONTROLRECT . Una aplicación también puede aumentar el ancho de una lista desplegable mediante el mensaje CB_SETDROPPEDWIDTH .

Contenido de la lista

Cuando una aplicación crea un cuadro combinado, normalmente inicializa el cuadro combinado agregando uno o varios elementos a la lista. Más adelante, una aplicación puede agregar o eliminar elementos de lista, reinicializar la lista o recuperar información de elementos de ella.

Una aplicación agrega elementos de lista a un cuadro combinado enviando el mensaje CB_ADDSTRING a él. El elemento especificado se agrega al final de la lista o, en un cuadro combinado ordenado, en su posición ordenada correcta en función de la cadena del elemento. En un cuadro combinado no ordenado, una aplicación puede usar el mensaje CB_INSERTSTRING para insertar un elemento en una posición específica. Una vez agregado, un elemento de lista se identifica por su posición.

Mediante el CB_FINDSTRING o CB_FINDSTRINGEXACT mensaje, una aplicación puede determinar la posición de un elemento de lista. CB_FINDSTRING busca un elemento cuya cadena comienza por la cadena especificada. CB_FINDSTRINGEXACT busca un elemento cuya cadena coincide exactamente con la cadena. Ninguno de los mensajes distingue mayúsculas de minúsculas.

Una aplicación puede quitar un elemento de lista mediante el mensaje CB_DELETESTRING . Si una aplicación necesita reinicializar la lista de cuadros combinados, primero puede borrar todo su contenido mediante el mensaje CB_RESETCONTENT . Al agregar varios elementos a la lista después de que ya se haya mostrado un cuadro combinado, una aplicación puede borrar la marca de volver a dibujar para evitar que se vuelva a dibujar el cuadro combinado después de agregar cada elemento. Para obtener más información sobre cómo volver a dibujar, vea la descripción del mensaje WM_SETREDRAW .

Para recuperar la cadena asociada a un elemento de lista, una aplicación puede usar el mensaje CB_GETLBTEXT . La cadena del elemento se copia en el búfer especificado por la aplicación. Para asegurarse de que el búfer es lo suficientemente grande como para recibir la cadena, la aplicación puede usar primero el mensaje de CB_GETLBTEXTLEN para determinar la longitud de la cadena. Para obtener el número de elementos de lista en un cuadro combinado, una aplicación puede usar el mensaje CB_GETCOUNT .

Editar campos de selección de controles

Una aplicación puede recuperar o establecer el contenido del campo de selección y puede determinar o establecer la selección de edición. La aplicación también puede limitar la cantidad de texto que un usuario puede escribir en el campo de selección. Cuando cambia el contenido del campo de selección, el sistema envía mensajes de notificación a la ventana principal o al procedimiento del cuadro de diálogo.

Para recuperar el contenido del campo de selección, una aplicación puede enviar el mensaje WM_GETTEXT al cuadro combinado. Para establecer el contenido del campo de selección de un cuadro combinado simple o desplegable, una aplicación puede enviar el mensaje WM_SETTEXT al cuadro combinado.

La selección de edición es el intervalo de texto seleccionado, si existe, en el campo de selección de un cuadro combinado simple o desplegable. Una aplicación puede determinar las posiciones de carácter inicial y final de la selección actual mediante el mensaje CB_GETEDITSEL . También puede seleccionar caracteres en la selección de edición mediante el mensaje CB_SETEDITSEL .

Inicialmente, la cantidad de texto que el usuario puede escribir en el campo de selección está limitado por el tamaño del campo de selección. Sin embargo, si el cuadro combinado tiene el estilo CBS_AUTOHSCROLL , el texto puede continuar más allá del tamaño del campo de selección. Una aplicación puede usar el CB_LIMITTEXT mensaje para limitar la cantidad de texto que un usuario puede escribir en el campo de selección, independientemente de si el control tiene el estilo CBS_AUTOHSCROLL .

Cuando el usuario edita el contenido del campo de selección, la ventana principal o el procedimiento del cuadro de diálogo recibe mensajes de notificación. El CBN_EDITUPDATE código de notificación se envía primero, lo que indica que se ha editado el texto del campo de selección. Una vez que se muestra el texto modificado, el sistema envía CBN_EDITCHANGE. Cuando el contenido del campo de selección cambia como resultado de que se selecciona un elemento de lista, estos mensajes no se envían.

cuadros combinados de Owner-Drawn

Una aplicación puede crear un cuadro combinado dibujado por el propietario para asumir la responsabilidad de pintar elementos de lista. La ventana primaria de un cuadro combinado dibujado por el propietario (su propietario) recibe WM_DRAWITEM mensajes cuando es necesario pintar una parte del cuadro combinado. Un cuadro combinado dibujado por el propietario puede enumerar información distinta o además de cadenas de texto. Los cuadros combinados dibujados por el propietario pueden ser de cualquier tipo. Sin embargo, el control de edición en un cuadro combinado simple o desplegable solo puede mostrar texto, mientras que el propietario pinta el campo de selección en un cuadro de lista desplegable.

El propietario de un cuadro combinado dibujado por el propietario debe procesar el mensaje WM_DRAWITEM . Este mensaje se envía cada vez que se debe volver a dibujar una parte del cuadro combinado. Es posible que el propietario necesite procesar otros mensajes, según los estilos especificados para el cuadro combinado.

Una aplicación puede crear un cuadro combinado dibujado por el propietario especificando el estilo CBS_OWNERDRAWFIXED o CBS_OWNERDRAWVARIABLE . Si todos los elementos de lista del cuadro combinado tienen el mismo alto, como cadenas o iconos, una aplicación puede usar el estilo CBS_OWNERDRAWFIXED . Si los elementos de lista tienen un alto variable, como mapas de bits de un tamaño diferente, una aplicación puede usar el estilo CBS_OWNERDRAWVARIABLE .

El propietario de un cuadro combinado dibujado por el propietario puede procesar un mensaje de WM_MEASUREITEM para especificar las dimensiones de los elementos de lista en el cuadro combinado. Si la aplicación crea el cuadro combinado mediante el estilo CBS_OWNERDRAWFIXED , el sistema envía el mensaje de WM_MEASUREITEM solo una vez. Las dimensiones especificadas por el propietario se usan para todos los elementos de lista. Si se usa el estilo CBS_OWNERDRAWVARIABLE , el sistema envía un mensaje de WM_MEASUREITEM para cada elemento de lista agregado al cuadro combinado. El propietario puede determinar o establecer el alto de un elemento de lista en cualquier momento mediante el CB_GETITEMHEIGHT y CB_SETITEMHEIGHT mensajes, respectivamente.

Si la información mostrada en un cuadro combinado dibujado por el propietario incluye texto, una aplicación puede realizar un seguimiento del texto de cada elemento de lista especificando el estilo CBS_HASSTRINGS . Los cuadros combinados con el estilo CBS_SORT se ordenan en función de este texto. Si un cuadro combinado está ordenado y no del estilo CBS_HASSTRINGS , el propietario debe procesar el mensaje WM_COMPAREITEM .

En un cuadro combinado dibujado por el propietario, el propietario debe realizar un seguimiento de los elementos de lista que contengan información distinta o además del texto. Una manera cómoda de hacerlo es guardar el identificador en la información como datos del elemento. Para liberar objetos de datos asociados a elementos de un cuadro combinado, el propietario puede procesar el mensaje WM_DELETEITEM .

Cuadros combinados con subclases

La subclases es un procedimiento que permite a una aplicación interceptar y procesar mensajes enviados o publicados en una ventana. Mediante el uso de subclases, una aplicación puede sustituir su propio procesamiento por determinados mensajes, al tiempo que deja la mayoría del procesamiento de mensajes en el procedimiento de ventana definido por la clase.

Cuando el sistema operativo crea una ventana, guarda información sobre ella en una estructura de datos interna que incluye un puntero al procedimiento de ventana. Para subclase de una ventana, una aplicación llama a la función SetClassLong para reemplazar el puntero a ese procedimiento por un puntero a un procedimiento de subclase definido por la aplicación. Después, todos los mensajes a la ventana se envían al procedimiento de subclase. A continuación, este procedimiento usa la función CallWindowProc para pasar mensajes sin procesar al procedimiento de ventana original. Para obtener una descripción del procesamiento de mensajes realizado por el procedimiento de ventana de clase COMBOBOX, vea Comportamiento predeterminado del cuadro combinado.

Cuando el cuadro combinado está fuera de un cuadro de diálogo, una aplicación no puede procesar las teclas TAB, ENTER y ESC a menos que use un procedimiento de subclase. Cuando un cuadro combinado simple o desplegable recibe el foco de entrada, establece inmediatamente el foco en su control de edición secundario. Por lo tanto, una aplicación debe subclase el control de edición para interceptar la entrada del teclado para un cuadro combinado simple o desplegable. Para obtener un ejemplo de esto, vea Subclase de un cuadro combinado.

Si un procedimiento de subclase procesa el mensaje WM_PAINT , debe usar la función BeginPaint para prepararse para pintar. Antes de llamar a la función EndPaint , pasa el identificador de contexto del dispositivo (DC) como parámetro wParam para el procedimiento de ventana. Si se llama a EndPaint en primer lugar, el procedimiento de ventana de clase no realiza ninguna pintura porque EndPaint valida toda la ventana.

Una técnica relacionada con las subclases es la superclase. Una superclase es similar a cualquier otra clase, salvo que su procedimiento de ventana no llama a DefWindowProc para controlar los mensajes no procesados. En su lugar, pasa mensajes sin procesar al procedimiento de ventana para la clase de ventana primaria. Siga las instrucciones de Procedimientos de ventana para evitar problemas que pueden producirse con subclases y superclases.