Compartir a través de


Acerca de los controles de encabezado

Un control de encabezado es una ventana que normalmente se coloca encima de las columnas de texto o números. Contiene un título para cada columna y se puede dividir en partes. El usuario puede arrastrar los divisores que separan las partes para establecer el ancho de cada columna. En la ilustración siguiente se muestra un control de encabezado que tiene columnas etiquetadas que proporcionan información detallada sobre los archivos de un directorio.

captura de pantalla de un cuadro de diálogo con un control de encabezado de tres columnas

Puede crear un control de encabezado mediante la función CreateWindowEx , especificando la clase de ventana WC_HEADER y los estilos de control de encabezado adecuados. Esta clase de ventana se registra cuando se carga el archivo DLL de control común. Para asegurarse de que se carga este archivo DLL, use la función InitCommonControlsEx . Después de crear un control de encabezado, puede dividirlo en partes, establecer el texto de cada parte y controlar la apariencia de la ventana mediante mensajes de ventana de encabezado.

Se puede crear un control de encabezado como una ventana secundaria de otro control, como un cuadro de lista. Sin embargo, el control primario no es consciente del control de encabezado y no permite el espacio ocupado por el encabezado, con el resultado de que los elementos de lista aparecerán detrás del encabezado. Si desea usar un control de encabezado en un cuadro de lista u otro control, el control primario debe dibujarse con el propietario para que todos los elementos se muestren en la posición correcta.

Los controles de vista de lista ya tienen controles de encabezado. En lugar de crear un control de encabezado para un control de vista de lista, use LVM_GETHEADER o ListView_GetHeader para recuperar el control existente.

Tamaño y posición del control de encabezado

Normalmente, debe establecer el tamaño y la posición de un control de encabezado para ajustarse a los límites de un rectángulo determinado, como el área cliente de una ventana. Mediante el HDM_LAYOUT mensaje, puede recuperar los valores de tamaño y posición adecuados del control de encabezado.

Al enviar HDM_LAYOUT, se especifica la dirección de una estructura HDLAYOUT que contiene las coordenadas del rectángulo que el control de encabezado va a ocupar y proporciona un puntero a una estructura WINDOWPOS . El control rellena la estructura WINDOWPOS con valores de tamaño y posición adecuados para colocar el control en la parte superior del rectángulo especificado. El valor de alto es la suma de las alturas de los bordes horizontales del control y el alto medio de caracteres de la fuente seleccionada actualmente en el contexto del dispositivo del control.

Si desea usar HDM_LAYOUT para establecer el tamaño inicial y la posición de un control de encabezado, establezca el estado de visibilidad inicial del control para que esté oculto. Después de enviar HDM_LAYOUT para recuperar los valores de tamaño y posición, puede usar la función SetWindowPos para establecer el nuevo tamaño, posición y estado de visibilidad.

Elementos

Normalmente, un control de encabezado tiene varios elementos de encabezado que definen las columnas del control. Para agregar un elemento a un control de encabezado, envíe el mensaje HDM_INSERTITEM al control. El mensaje incluye la dirección de una estructura HDITEM . Esta estructura define las propiedades del elemento de encabezado, que pueden incluir una cadena, una imagen de mapa de bits, un tamaño inicial y un valor LPARAM definido por la aplicación.

El miembro fmt de la estructura HDITEM de un elemento puede incluir la marca HDF_STRING o HDF_BITMAP para indicar si el control muestra la cadena o el mapa de bits del elemento. Si desea mostrar una cadena y un mapa de bits, cree un elemento dibujado por el propietario estableciendo el miembro fmt para incluir la marca HDF_OWNERDRAW . La estructura HDITEM también especifica marcas de formato que indican al control si se debe centrar, alinear a la izquierda o alinear a la derecha la cadena o mapa de bits en el rectángulo del elemento.

HDM_INSERTITEM devuelve el índice del elemento recién agregado. Puede usar el índice en otros mensajes para establecer propiedades o recuperar información sobre el elemento. Puede eliminar un elemento mediante el mensaje HDM_DELETEITEM , especificando el índice del elemento que se va a eliminar.

Puede usar el mensaje de HDM_SETITEM para establecer las propiedades de un elemento de encabezado existente y el mensaje de HDM_GETITEM para recuperar las propiedades actuales de un elemento. Para recuperar un recuento de los elementos de un control de encabezado, use el mensaje HDM_GETITEMCOUNT .

Controles de encabezado de Owner-Drawn

Puede definir elementos individuales de un control de encabezado para que sean elementos dibujados por el propietario. El uso de esta técnica proporciona más control de lo que tendría sobre la apariencia de un elemento de encabezado.

Puede usar el mensaje HDM_INSERTITEM para insertar un nuevo elemento dibujado por el propietario en un control de encabezado o el mensaje HDM_SETITEM para cambiar un elemento existente a un elemento dibujado por el propietario. Ambos mensajes incluyen la dirección de una estructura HDITEM , que debe tener el miembro fmt establecido en el valor de HDF_OWNERDRAW .

Cuando un control de encabezado debe dibujar un elemento dibujado por el propietario, envía el mensaje WM_DRAWITEM a la ventana primaria. El parámetro wParam del mensaje es el identificador de ventana secundario del control de encabezado y el parámetro lParam es una dirección de una estructura DRAWITEMSTRUCT . La ventana primaria usa la información de la estructura para dibujar el elemento. Para un elemento dibujado por el propietario en un control de encabezado, la estructura DRAWITEMSTRUCT contiene la siguiente información.

Miembro Descripción
CtlType ODT_HEADER tipo de control dibujado por el propietario.
CtlID Identificador de ventana secundaria del control de encabezado.
Itemid Índice del elemento que se va a dibujar.
itemAction ODA_DRAWENTIRE marca de acción de dibujo.
itemState ODS_SELECTED marca de acción de dibujo si el cursor está en el elemento y el botón del mouse está inactivo. De lo contrario, este miembro es cero.
hwndItem Identificador del control de encabezado.
hDC Controle el contexto del dispositivo del control de encabezado.
rcItem Coordenadas del elemento de encabezado que se va a dibujar. Las coordenadas son relativas a la esquina superior izquierda del control de encabezado.
itemData Valor de 32 bits definido por la aplicación asociado al elemento.

 

Filtros de control de encabezado

Al especificar el estilo de ventana de HDS_FILTERBAR para un control de encabezado, puede habilitar la colocación de cuadros de edición de filtro debajo de los encabezados de columna. Aparece un botón de filtro junto al cuadro de edición. Puede implementar el filtrado respondiendo a los códigos de notificación de HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICK o HDN_FILTERCHANGE .

De forma predeterminada, el cuadro de edición contiene un mensaje para que el usuario escriba texto. Puede restaurar el cuadro de edición a este estado predeterminado mediante Header_ClearFilter o Header_ClearAllFilters.

En el ejemplo de código siguiente se muestra cómo recuperar el control de encabezado de un control de vista de lista y agregar una barra de filtro.

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

Procesamiento de mensajes de control de encabezado predeterminado

En esta sección se describen los mensajes de ventana que controla el procedimiento de ventana para la clase de ventana WC_HEADER .

Message Procesamiento realizado
WM_CREATE Inicializa el control de encabezado.
WM_DESTROY Anula la inicialización del control de encabezado.
WM_ERASEBKGND Rellena el fondo del control de encabezado mediante el color de fondo actual del control.
WM_GETDLGCODE Devuelve una combinación de los valores de DLGC_WANTTAB y DLGC_WANTARROWS .
WM_GETFONT Devuelve el identificador a la fuente actual, que usa el control de encabezado para dibujar su texto.
WM_LBUTTONDBLCLK Captura la entrada del mouse. Si el cursor del mouse está en un divisor, el control envía el código de notificación de HDN_BEGINTRACK y comienza a arrastrar el divisor. Si el cursor está en un elemento, el elemento se muestra en el estado presionado.
WM_LBUTTONDOWN Igual que el mensaje WM_LBUTTONDBLCLK .
WM_LBUTTONUP Libera la captura del mouse. Si el control estaba realizando el seguimiento del movimiento del mouse, envía el código de notificación HDN_ENDTRACK y vuelve a dibujar el control de encabezado. De lo contrario, el control envía el código de notificación HDN_ITEMCLICK y vuelve a dibujar el elemento de encabezado en el que se hizo clic.
WM_MOUSEMOVE Si se arrastra un divisor, el control envía el código de notificación HDN_TRACK y muestra el elemento en la nueva posición. Si el botón izquierdo del mouse está inactivo y el cursor está en un elemento, el elemento se muestra en el estado presionado.
WM_NCCREATE Asigna e inicializa una estructura de datos interna.
WM_NCDESTROY Libera los recursos asignados por el control de encabezado después de que el control de encabezado no se inicialice.
WM_PAINT Pinta la región no válida del control de encabezado. Si el parámetro wParam no es NULL, el control asume que el valor es un HDC y pinta mediante ese contexto de dispositivo.
WM_SETCURSOR Establece la forma del cursor, dependiendo de si el cursor está en un divisor o en un elemento de encabezado.
WM_SETFONT Selecciona un nuevo identificador de fuente en el contexto del dispositivo para el control de encabezado.