Cómo crear un control de pestaña en la ventana principal
En el ejemplo de esta sección se muestra cómo crear un control de pestaña y mostrarlo en el área cliente de la ventana principal de la aplicación. La aplicación muestra una tercera ventana (un control estático) en el área de visualización del control de pestaña. La ventana primaria coloca y ajusta el tamaño del control de pestaña y el control estático cuando procesa el mensaje de WM_SIZE.
Hay siete pestañas en este ejemplo, una para cada día de la semana. Cuando el usuario selecciona una pestaña, la aplicación muestra el nombre del día correspondiente en el control estático.
Lo que necesita saber
Tecnologías
Requisitos previos
- C/C++
- Programación de la interfaz de usuario de Windows
Instrucciones
Crear un control de pestaña en la ventana principal
La siguiente función crea el control de pestaña y agrega una pestaña para cada día de la semana. Los nombres de los días se definen como recursos de cadena, numerados consecutivamente a partir de IDS_SUNDAY (definidos en el archivo de encabezado de recursos de la aplicación). Tanto la ventana primaria como el control de pestaña deben tener el estilo de ventana WS_CLIPSIBLINGS. La función de inicialización de la aplicación llama a esta función después de crear la ventana principal.
#define DAYS_IN_WEEK 7
// Creates a tab control, sized to fit the specified parent window's client
// area, and adds some tabs.
// Returns the handle to the tab control.
// hwndParent - parent window (the application's main window).
//
HWND DoCreateTabControl(HWND hwndParent)
{
RECT rcClient;
INITCOMMONCONTROLSEX icex;
HWND hwndTab;
TCITEM tie;
int i;
TCHAR achTemp[256]; // Temporary buffer for strings.
// Initialize common controls.
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&icex);
// Get the dimensions of the parent window's client area, and
// create a tab control child window of that size. Note that g_hInst
// is the global instance handle.
GetClientRect(hwndParent, &rcClient);
hwndTab = CreateWindow(WC_TABCONTROL, L"",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0, rcClient.right, rcClient.bottom,
hwndParent, NULL, g_hInst, NULL);
if (hwndTab == NULL)
{
return NULL;
}
// Add tabs for each day of the week.
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
tie.pszText = achTemp;
for (i = 0; i < DAYS_IN_WEEK; i++)
{
// Load the day string from the string resources. Note that
// g_hInst is the global instance handle.
LoadString(g_hInst, IDS_SUNDAY + i,
achTemp, sizeof(achTemp) / sizeof(achTemp[0]));
if (TabCtrl_InsertItem(hwndTab, i, &tie) == -1)
{
DestroyWindow(hwndTab);
return NULL;
}
}
return hwndTab;
}
La función siguiente crea el control estático que reside en el área de visualización del control de pestaña. La función de inicialización de la aplicación llama a esta función después de crear la ventana principal y el control de pestaña.
Tenga en cuenta que el control estático se coloca en el área de visualización del control de pestaña, pero es un elemento del mismo nivel que el control de pestaña, no un elemento secundario. Esto permite que el control estático participe en el orden de tabulación de la ventana primaria compartida. Esto no es significativo para un control estático, pero es una buena práctica en caso de que se reemplace por un control accesible para teclado como un botón.
// Creates a child window (a static control) to occupy the tab control's
// display area.
// Returns the handle to the static control.
// hwndTab - handle of the tab control.
//
HWND DoCreateDisplayWindow(HWND hwndTab)
{
HWND hwndStatic = CreateWindow(WC_STATIC, L"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
100, 100, 100, 100, // Position and dimensions; example only.
GetParent(hwndTab), NULL, g_hInst, // g_hInst is the global instance handle
NULL);
return hwndStatic;
}
Se llama a las funciones de ejemplo siguientes desde el procedimiento de ventana de la aplicación. La aplicación llama a la función OnSize
al procesar el mensaje WM_SIZE para colocar y ajustar el tamaño del control de pestaña a fin de ajustarse al área cliente de la ventana principal.
Cuando se selecciona una pestaña, el control de pestaña envía un mensaje WM_NOTIFY, especificando el código de notificación TCN_SELCHANGE. La función OnNotify
de la aplicación procesa este código de notificación estableciendo el texto del control estático.
// Handles the WM_SIZE message for the main window by resizing the
// tab control.
// hwndTab - handle of the tab control.
// lParam - the lParam parameter of the WM_SIZE message.
//
HRESULT OnSize(HWND hwndTab, LPARAM lParam)
{
RECT rc;
if (hwndTab == NULL)
return E_INVALIDARG;
// Resize the tab control to fit the client are of main window.
if (!SetWindowPos(hwndTab, HWND_TOP, 0, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), SWP_SHOWWINDOW))
return E_FAIL;
return S_OK;
}
// Handles notifications from the tab control, as follows:
// TCN_SELCHANGING - always returns FALSE to allow the user to select a
// different tab.
// TCN_SELCHANGE - loads a string resource and displays it in a static
// control on the selected tab.
// hwndTab - handle of the tab control.
// hwndDisplay - handle of the static control.
// lParam - the lParam parameter of the WM_NOTIFY message.
//
BOOL OnNotify(HWND hwndTab, HWND hwndDisplay, LPARAM lParam)
{
TCHAR achTemp[256]; // temporary buffer for strings
switch (((LPNMHDR)lParam)->code)
{
case TCN_SELCHANGING:
{
// Return FALSE to allow the selection to change.
return FALSE;
}
case TCN_SELCHANGE:
{
int iPage = TabCtrl_GetCurSel(hwndTab);
// Note that g_hInst is the global instance handle.
LoadString(g_hInst, IDS_SUNDAY + iPage, achTemp,
sizeof(achTemp) / sizeof(achTemp[0]));
LRESULT result = SendMessage(hwndDisplay, WM_SETTEXT, 0,
(LPARAM) achTemp);
break;
}
}
return TRUE;
}
Temas relacionados