Acerca de los controles de pestaña
Un control de ficha es análogo a los divisores de un bloc de notas o las etiquetas de un archivador. Mediante el uso de un control de ficha, una aplicación puede definir varias páginas para la misma área de un cuadro de diálogo o de una ventana. Cada página consta de un determinado tipo de información o un grupo de controles que la aplicación muestra cuando el usuario selecciona la pestaña correspondiente.
En la siguiente captura de pantalla se muestra un control de pestaña simple que contiene pestañas durante días de la semana. Se ha seleccionado la pestaña Martes.
En este tema se incluyen las secciones siguientes.
- Crear controles de pestaña
- Estilos de control tab
- Pestañas y atributos de pestaña
- Área de visualización
- Selección de pestañas
- Listas de imágenes de control de pestañas
- Tamaño y posición de tabulación
- Pestañas dibujadas por el propietario
- Información sobre herramientas de control de pestañas
- Procesamiento de mensajes de control de tabulación predeterminado
Crear controles de pestaña
Puede crear un control de pestaña llamando a la función CreateWindowEx , especificando la clase de ventana WC_TABCONTROL . Esta clase de ventana se registra cuando se carga el archivo DLL de controles comunes. Para asegurarse de que el archivo DLL está cargado, use la función InitCommonControlsEx .
En Microsoft Visual Studio, puede crear un control de pestaña mediante el Cuadro de herramientas.
Los mensajes se envían a un control de pestaña para agregar pestañas y, de lo contrario, afectan a la apariencia y el comportamiento del control. Cada mensaje tiene una macro correspondiente que puede usar en lugar de enviar el mensaje explícitamente. No se puede deshabilitar una pestaña individual en un control de pestaña. Sin embargo, puede deshabilitar un control de pestaña en una hoja de propiedades deshabilitando la página correspondiente.
Estilos de control tab
Puede aplicar ciertas características a los controles de pestaña especificando estilos de control de pestaña cuando se crea el control. Por ejemplo, puede especificar la alineación y la apariencia general de las pestañas en un control de pestaña.
Puede hacer que las pestañas parezcan botones especificando el estilo TCS_BUTTONS . Las pestañas de este tipo de control de ficha deben servir a la misma función que los controles de botón; es decir, hacer clic en una pestaña debe llevar a cabo un comando en lugar de mostrar una página. Dado que el área de presentación de un control de ficha de botón no se usa normalmente, no se dibuja ningún borde alrededor de él.
Puede hacer que una pestaña reciba el foco de entrada al hacer clic especificando el estilo de TCS_FOCUSONBUTTONDOWN . Este estilo se usa normalmente solo con el estilo TCS_BUTTONS . Puede especificar que una pestaña no recibe el foco de entrada al hacer clic con el estilo TCS_FOCUSNEVER .
De forma predeterminada, un control de pestaña muestra solo una fila de pestañas. Si no se pueden mostrar todas las pestañas a la vez, el control de pestaña muestra un control de arriba abajo para que el usuario pueda desplazarse por pestañas adicionales a la vista. Puede hacer que un control de pestaña muestre varias filas de pestañas, si es necesario, especificando el estilo TCS_MULTILINE . Con este estilo, todas las pestañas se pueden mostrar a la vez. Las pestañas se alinean a la izquierda dentro de cada fila a menos que especifique el estilo de TCS_RIGHTJUSTIFY . En este caso, se aumenta el ancho de cada pestaña para que cada fila de fichas rellene todo el ancho del control de tabulación.
Un control de pestaña ajusta automáticamente el tamaño de cada pestaña para ajustarse a su icono, si existe, y su etiqueta. Para dar a todas las pestañas el mismo ancho, puede especificar el estilo TCS_FIXEDWIDTH . El control ajusta todos los tamaños de las pestañas para ajustarse a la etiqueta más ancha, o bien puede asignar un ancho y alto específicos mediante el mensaje TCM_SETITEMSIZE . Dentro de cada pestaña, el control centra el icono y la etiqueta, colocando el icono a la izquierda de la etiqueta. Puede forzar el icono a la izquierda, dejando la etiqueta centrada, especificando el estilo TCS_FORCEICONLEFT . Puede alinear a la izquierda el icono y la etiqueta mediante el estilo TCS_FORCELABELLEFT . No se puede usar el estilo de TCS_FIXEDWIDTH con el estilo TCS_RIGHTJUSTIFY .
Puede especificar que la ventana primaria dibuja las pestañas en el control mediante el estilo TCS_OWNERDRAWFIXED . Para obtener más información, vea Pestañas dibujadas por el propietario.
Puede especificar que un control de pestaña creará un control de información sobre herramientas mediante el estilo TCS_TOOLTIPS . Para obtener más información sobre esto, vea Información sobre herramientas de control de pestañas.
Pestañas y atributos de pestaña
Cada pestaña de un control de pestaña consta de un icono, una etiqueta y datos definidos por la aplicación. Esta información se especifica mediante una estructura TCITEM . Puede agregar pestañas a un control de pestaña, recuperar el número de pestañas, recuperar y establecer el contenido de una pestaña y eliminar pestañas. Las pestañas se identifican mediante su índice de base cero.
Para agregar pestañas a un control de ficha, use el mensaje TCM_INSERTITEM , especificando la posición del elemento y la dirección de una estructura TCITEM . Puede recuperar y establecer el contenido de una pestaña existente mediante los mensajes TCM_GETITEM y TCM_SETITEM . Para cada pestaña, puede especificar un icono, una etiqueta o ambos. También puede especificar datos definidos por la aplicación para asociarlos a la pestaña.
Puede recuperar el número actual de pestañas mediante el mensaje TCM_GETITEMCOUNT , eliminar una pestaña mediante el mensaje TCM_DELETEITEM y eliminar todas las pestañas de un control de pestaña mediante el TCM_DELETEALLITEMS mensaje.
Puede asociar datos definidos por la aplicación a cada pestaña. Por ejemplo, puede guardar información sobre cada página con su pestaña correspondiente. De forma predeterminada, un control de pestaña asigna cuatro bytes adicionales por pestaña para los datos definidos por la aplicación. Puede cambiar el número de bytes adicionales por pestaña mediante el mensaje TCM_SETITEMEXTRA . Solo puede usar este mensaje cuando el control de ficha está vacío.
El miembro lParam de la estructura TCITEM especifica los datos definidos por la aplicación. Si usa más de 4 bytes de datos definidos por la aplicación, debe definir su propia estructura y usarla en lugar de TCITEM. Puede recuperar y establecer datos definidos por la aplicación de la misma manera que recupera y establece otra información sobre una pestaña mediante los mensajes TCM_GETITEM y TCM_SETITEM .
El primer miembro de la estructura debe ser una estructura TCITEMHEADER y los miembros restantes deben especificar datos definidos por la aplicación. TCITEMHEADER es idéntico a TCITEM, salvo que no tiene el miembro lParam . La diferencia entre el tamaño de la estructura y el tamaño de TCITEMHEADER debe ser igual al número de bytes adicionales por pestaña.
Área de visualización
El área de presentación de un control de pestaña es el área en la que una aplicación muestra la página actual. Normalmente, una aplicación crea una ventana o un cuadro de diálogo secundarios, estableciendo el tamaño y la posición de la ventana para ajustarse al área de visualización. Dado el rectángulo de ventana de un control de pestaña, puede calcular el rectángulo delimitador del área de presentación mediante el mensaje TCM_ADJUSTRECT .
A veces, el área de presentación debe ser un tamaño determinado; por ejemplo, el tamaño de un cuadro de diálogo secundario modela. Dado el rectángulo delimitador del área de presentación, puede usar TCM_ADJUSTRECT para calcular el rectángulo de ventana correspondiente para el control de ficha.
Selección de pestañas
Cuando el usuario selecciona una pestaña, un control de pestaña envía sus códigos de notificación de ventana principal en forma de WM_NOTIFY mensajes. El código de notificación TCN_SELCHANGING se envía antes de que cambie la selección y el código de notificación TCN_SELCHANGE se envía después de que la selección cambie.
Puede procesar TCN_SELCHANGING para guardar el estado de la página saliente. Puede devolver TRUE para evitar que la selección cambie. Por ejemplo, es posible que no desee cambiar de un cuadro de diálogo secundario en el que un control tiene una configuración no válida.
Debe procesar TCN_SELCHANGE para mostrar la página entrante en el área de visualización. Esto puede implicar simplemente cambiar la información mostrada en una ventana secundaria. Con más frecuencia, cada página consta de una ventana o un cuadro de diálogo secundarios. En este caso, una aplicación podría procesar esta notificación destruyendo u ocultando la ventana o el cuadro de diálogo secundarios salientes y creando o mostrando la ventana o el cuadro de diálogo secundarios entrantes.
Puede recuperar y establecer la selección actual mediante los mensajes TCM_GETCURSEL y TCM_SETCURSEL .
Listas de imágenes de control de pestañas
Cada pestaña puede tener un icono asociado, que se especifica mediante un índice en la lista de imágenes del control de ficha. Cuando se crea un control de pestaña, no tiene ninguna lista de imágenes asociada. Una aplicación puede crear una lista de imágenes mediante la función ImageList_Create y, a continuación, asignarla a un control de pestaña mediante el mensaje TCM_SETIMAGELIST .
Puede agregar imágenes a la lista de imágenes de un control de pestaña como lo haría con cualquier otra lista de imágenes. Sin embargo, una aplicación debe quitar imágenes mediante el mensaje TCM_REMOVEIMAGE en lugar de la función ImageList_Remove . Este mensaje garantiza que cada pestaña permanece asociada a la misma imagen que antes.
Si se destruye un control de ficha, no se destruye una lista de imágenes asociada. Debe destruir la lista de imágenes por separado. Esto es útil si desea asignar la misma lista de imágenes a varios controles de pestaña.
Para recuperar el identificador de la lista de imágenes asociada actualmente a un control de pestaña, puede usar el mensaje TCM_GETIMAGELIST .
Tamaño y posición de tabulación
Cada pestaña de un control de pestaña tiene un tamaño y una posición. Puede establecer el tamaño de las pestañas, recuperar el rectángulo delimitador de una pestaña o determinar qué pestaña está en una posición especificada.
En el caso de los controles de pestaña dibujados por el propietario y de ancho fijo, puede establecer el ancho exacto y el alto de las pestañas mediante el mensaje TCM_SETITEMSIZE . En otros controles de pestaña, el tamaño de cada pestaña se calcula en función del icono y la etiqueta de la pestaña. El control de pestaña incluye espacio para un borde y un margen adicional. Puede establecer el grosor del margen mediante el mensaje TCM_SETPADDING .
Puede determinar el rectángulo delimitador actual de una pestaña mediante el mensaje TCM_GETITEMRECT . Puede determinar qué pestaña, si existe, se encuentra en una ubicación especificada mediante el mensaje TCM_HITTEST .
En un control de pestaña con el estilo TCS_MULTILINE , puede determinar el número actual de filas de pestañas mediante el mensaje TCM_GETROWCOUNT .
pestañas de Owner-Drawn
Si un control de pestaña tiene el estilo TCS_OWNERDRAWFIXED , la ventana primaria debe pintar pestañas procesando el mensaje WM_DRAWITEM . El control de pestaña envía este mensaje cada vez que es necesario pintar una pestaña. El parámetro lParam especifica la dirección de una estructura DRAWITEMSTRUCT , que contiene el índice de la pestaña, su rectángulo delimitador y el contexto del dispositivo (DC) en el que se va a dibujar.
De forma predeterminada, el miembro itemData de DRAWITEMSTRUCT contiene el valor del miembro lParam de la estructura TCITEM . Sin embargo, si cambia la cantidad de datos definidos por la aplicación por pestaña, itemData contiene la dirección de los datos en su lugar. Puede cambiar la cantidad de datos definidos por la aplicación por pestaña mediante el mensaje TCM_SETITEMEXTRA .
Para especificar el tamaño de los elementos de un control de pestaña, la ventana primaria debe procesar el mensaje de WM_MEASUREITEM . Dado que todas las pestañas de un control de pestaña dibujada por el propietario tienen el mismo tamaño, este mensaje se envía solo una vez. No hay ningún estilo de control de tabulación para las pestañas dibujadas por el propietario de un tamaño variable. También puede establecer el ancho y el alto de las pestañas mediante el mensaje TCM_SETITEMSIZE .
Información sobre herramientas de control de pestañas
Puede usar un control de información sobre herramientas para proporcionar una breve descripción de cada pestaña en un control de pestaña. Un control de pestaña que tiene el estilo TCS_TOOLTIPS crea un control de información sobre herramientas cuando se crea y destruye el control de información sobre herramientas cuando se destruye. También puede crear un control de información sobre herramientas y asignarlo a un control de pestaña.
Si usa un control de información sobre herramientas con un control de pestaña, la ventana primaria debe procesar el código de notificación de TTN_GETDISPINFO para proporcionar una descripción de cada pestaña a petición.
Para usar el mismo control de información sobre herramientas con más de un control de pestaña, cree el control de información sobre herramientas usted mismo y asígnelo al control de pestaña mediante el mensaje TCM_SETTOOLTIPS . Puede recuperar el identificador del control de información sobre herramientas actual de un control de pestaña mediante el mensaje TCM_GETTOOLTIPS . Si crea su propio control de información sobre herramientas, no debe usar el estilo TCS_TOOLTIPS .
Procesamiento de mensajes de control de pestañas predeterminado
En esta sección se describe el procesamiento de mensajes realizado por un control de pestaña. Los mensajes específicos de los controles de pestaña se describen en otras secciones de esta documentación.
Message | Procesamiento realizado |
---|---|
WM_CAPTURECHANGED | No hace nada si el control tab libera la propia captura del mouse. Si otra ventana capturó el mouse y se mantiene presionado un botón, el comando libera el botón. |
WM_CREATE | Asigna e inicializa una estructura de datos interna. El control crea un control de información sobre herramientas si se especifica el estilo TCS_TOOLTIPS . |
WM_DESTROY | Libera los recursos asignados durante el procesamiento de WM_CREATE . |
WM_GETDLGCODE | Devuelve una combinación de los valores de DLGC_WANTARROWS y DLGC_WANTCHARS. |
WM_GETFONT | Devuelve el identificador a la fuente usada para las etiquetas. |
WM_KEYDOWN | Procesa las claves de dirección y cambia la selección, si procede. |
WM_KILLFOCUS | Invalida la pestaña que tiene el foco para que se vuelva a dibujar para reflejar un estado sin centrar. |
WM_LBUTTONDOWN | Reenvía el mensaje al control de información sobre herramientas, si existe, y cambia la selección si el usuario hace clic en una pestaña. Si el usuario hace clic en un botón, el control vuelve a dibujar el botón para dar una apariencia hundida y captura el mouse. Si el usuario hace clic en una pestaña o un botón y se especifica el estilo TCS_FOCUSONBUTTONDOWN , el control establece el foco en sí mismo. |
WM_LBUTTONUP | Libera el mouse si se ha presionado un botón. Si el cursor está sobre el botón y se mantiene presionado, el control cambia la selección en consecuencia y vuelve a dibujar el botón. |
WM_MOUSEMOVE | Reenvía el mensaje al control de información sobre herramientas, si existe. Si se especifica el estilo TCS_BUTTONS y el botón del mouse se mantiene presionado después de hacer clic, el control también puede volver a dibujar el botón afectado para darle una apariencia elevada o hundida. |
WM_NOTIFY | Reenvía los códigos de notificación enviados por el control de información sobre herramientas. |
WM_PAINT | Dibuja un borde alrededor del área de presentación (a menos que se especifique el estilo TCS_BUTTONS ) y pinta las pestañas que intersecan el rectángulo no válido. Para cada pestaña, dibuja el cuerpo de la pestaña (o envía un mensaje de WM_DRAWITEM a la ventana primaria) y, a continuación, dibuja un borde alrededor de la pestaña. 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_RBUTTONDOWN | Envía un código de notificación NM_RCLICK a la ventana primaria. |
WM_SETFOCUS | Invalida la pestaña que tiene el foco para que se vuelva a dibujar para reflejar un estado centrado. |
WM_SETFONT | Establece la fuente usada para las etiquetas. |
WM_SETREDRAW | Establece el estado de una marca interna que determina si el control se vuelve a pintar cuando se insertan y eliminan los elementos, cuando se cambia la fuente, etc. |
WM_SIZE | Vuelve a calcular las posiciones de las pestañas y puede invalidar parte del control de tabulación para forzar la reintentos de algunas o todas las pestañas. |