Поделиться через


Создание элемента управления TAB в главном окне

В этом разделе показано, как создать элемент управления tab и отобразить его в клиентской области главного окна приложения. Приложение отображает третье окно (статический элемент управления) в области отображения элемента управления вкладки. Родительский окно позиций и размер элемента управления tab и статического элемента управления при обработке сообщения WM_SIZE .

В этом примере есть семь вкладок, по одному для каждого дня недели. Когда пользователь выбирает вкладку, приложение отображает имя соответствующего дня в статическом элементе управления.

Это важно знать

Технологии

Необходимые компоненты

  • C/C++
  • Программирование пользовательского интерфейса Windows

Instructions

Создание элемента управления TAB в главном окне

Следующая функция создает элемент управления tab и добавляет вкладку для каждого дня недели. Имена дней определяются как строковые ресурсы, последовательно нумеруемые начиная с IDS_SUNDAY (определенных в файле заголовка ресурса приложения). В родительском окне и элементе управления вкладки должен быть стиль окна WS_C пакет интерфейса пользователя SIBLINGS. Функция инициализации приложения вызывает эту функцию после создания главного окна.

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

Следующая функция создает статический элемент управления, который находится в области отображения элемента управления tab. Функция инициализации приложения вызывает эту функцию после создания главного окна и элемента управления табуляции.

Обратите внимание, что статический элемент управления размещается в области отображения элемента управления табуляции, но сам элемент управления вкладки является одноуровневой, а не дочерним элементом. Это позволяет статическому элементу управления участвовать в порядке вкладок общего родительского окна. Это не важно для статического элемента управления, но рекомендуется в случае, если оно заменено на элемент управления, доступный для клавиатуры, как кнопка.

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

В следующем примере функции вызываются из процедуры окна приложения. Приложение вызывает OnSize функцию при обработке сообщения WM_SIZE для размещения и размера элемента управления табуляции, чтобы соответствовать клиентской области главного окна.

При выборе вкладки элемент управления вкладки отправляет сообщение WM_NOTIFY, указывая код уведомления TCN_SELCHANGE. Функция приложения OnNotify обрабатывает этот код уведомления, задав текст статического элемента управления.

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

Использование элементов управления tab

Демонстрация общих элементов управления Windows (CppWindowsCommonControls)