Condividi tramite


Come creare un controllo Struttura a schede nella finestra principale

L'esempio in questa sezione illustra come creare un controllo struttura a schede e visualizzarlo nell'area client della finestra principale dell'applicazione. L'applicazione visualizza una terza finestra (un controllo statico) nell'area di visualizzazione del controllo struttura a schede. La finestra padre posiziona e ridimensiona il controllo struttura a schede e il controllo statico quando elabora il messaggio WM_SIZE.

In questo esempio sono presenti sette schede, una per ogni giorno della settimana. Quando l'utente seleziona una scheda, l'applicazione visualizza il nome del giorno corrispondente nel controllo statico.

Informazioni importanti

Tecnologie

Prerequisiti

  • C/C++
  • Programmazione dell'interfaccia utente di Windows

Istruzioni

Creare un controllo Struttura a schede nella finestra principale

La funzione seguente crea il controllo struttura a schede e aggiunge una scheda per ogni giorno della settimana. I nomi dei giorni vengono definiti come risorse stringa, numerati consecutivamente a partire da IDS_SUNDAY (definiti nel file di intestazione delle risorse dell'applicazione). Sia la finestra padre che il controllo struttura a schede devono avere lo stile della finestra WS_CLIPSIBLINGS . La funzione di inizializzazione dell'applicazione chiama questa funzione dopo aver creato la finestra principale.

#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 funzione seguente crea il controllo statico che si trova nell'area di visualizzazione del controllo struttura a schede. La funzione di inizializzazione dell'applicazione chiama questa funzione dopo aver creato la finestra principale e il controllo struttura a schede.

Si noti che il controllo statico è posizionato nell'area di visualizzazione del controllo struttura a schede, ma si tratta di un elemento di pari livello del controllo struttura a schede, non di un elemento figlio. In questo modo il controllo statico può partecipare all'ordine di tabulazioni della finestra padre condivisa. Questo non è significativo per un controllo statico, ma è una procedura consigliata nel caso in cui venga sostituito con un controllo accessibile da tastiera come un pulsante.

// 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; 
}

Le funzioni di esempio seguenti vengono chiamate dalla routine della finestra dell'applicazione. L'applicazione chiama la funzione durante l'elaborazione OnSize del messaggio WM_SIZE per posizionare e ridimensionare il controllo struttura a schede in modo da adattare l'area client della finestra principale.

Quando si seleziona una scheda, il controllo struttura a schede invia un messaggio di WM_NOTIFY, specificando il codice di notifica TCN_edizione Standard LCHANGE. La funzione dell'applicazione OnNotify elabora questo codice di notifica impostando il testo del controllo statico.

// 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;
}

Uso dei controlli struttura a schede

Demo dei controlli comuni di Windows (CppWindowsCommonControls)