API и FreeBasic. (дочерние окна-TAB)

TAB или попросту вкладки представляют из себя вереницу кнопок с общей областью, на которой есть возможность разместить необходимые элементы. В результате этого, будет создаваться видимость переключения нескольких страниц для одной области окна. На практике данный контрол применяют довольно часто. Достаточно взглянуть на любой продвинутый текстовый редактор (к пр. Notepad++):

TAB1.png

При создании вкладок и их дочерних окон не означает, что вместе с ними автоматически будут переключаться закрепленные с ними окна. При использовании кнопок вкладок, система отправляет соответствующие сообщения родительскому окну, а вся реализация функциональности, которая будет закреплена за вкладками, ложится на плечи программиста. Если по простому, то от программиста требуется:

  1. создать контрол TAB
  2. создать нужное кол-во вкладок
  3. для каждой вкладки создать и прикрутить необходимые дочерние окна
  4. при отлове сообщений от нажатий вкладок, отображать только те дочерние окна, которые за ней закреплены, остальные спрятать

1: Cоздании окна TAB производится с помощью функции CreateWindow или CreateWindowEx, при этом Microsoft рекомендует в его стиле указать WS_CLIPSIBLINGS.

2: Создание вкладок осуществляется с помощью сообщения TCM_INSERTITEM при этом в параметре WPARAM передается индекс вкладки, а в параметре LPARAM указатель на заполненную структуру TCITEM:

Type TCITEMA
    mask As UINT ' маска использования полей структуры (TCIF_TEXT,TCIF_IMAGE,TCIF_PARAM)
    dwState As DWORD ' не используется
    dwStateMask As DWORD ' не используется
    pszText As LPSTR ' указатель на строку для вкладки
    cchTextMax As Integer ' длина строки поля pszText
    iImage As Integer ' индекс изображения из списка изображений
    lParam As LPARAM ' дополнительные данные, определяемые пользователем
End Type


Сообщение TCM_INSERTITEM можно заменить более удобным макросом: TabCtrl_InsertItem и в примере ниже так и сделано. Я не буду в примере использовать иконки(изображения) для вкладок. Принцип создания и использования списка изображений аналогичен принципу с контролом LISTVIEW . И для использования их достаточно указать маску TCIF_IMAGE и передать индекс изображения в поле iImage структуры TCITEM

3: Создание дочерних контролов осуществляется обычным способом. Но для них родителем нужно указать контрол TAB

4: При отлове сообщения WM_NOTIFY и кода извещения TCN_SELCHANGE (переключение вкладок), можно скрывать\отображать нужные контролы, либо создавать\удалять

Стили для контрола TAB:

  • TCS_BOTTOM - Вкладки отображаются в нижней части элемента управления
  • TCS_BUTTONS - Вкладки отображаются в виде кнопок, и нет границы области.
  • TCS_FIXEDWIDTH - Все вкладки имеют одинаковую ширину. Этот стиль не может быть объединен с TCS_RIGHTJUSTIFY
  • TCS_FLATBUTTONS - Выбранные вкладки отображаются нажатыми, а другие вкладки отображаются в той же плоскости, что и фон. Этот стиль влияет совместно со стилем TCS_BUTTONS
  • TCS_FOCUSNEVER - Вкладка не получает фокус ввода при нажатии
  • TCS_FOCUSONBUTTONDOWN - Вкладка получает фокус ввода при нажатии
  • TCS_FORCEICONLEFT - Иконки выравниваются по левому краю каждой фиксированной ширины вкладки. Этот стиль может быть использован только со стилем TCS_FIXEDWIDTH
  • TCS_FORCELABELLEFT - Строки выровнены по левому краю каждой фиксированной ширины вкладки, то есть, метка отображается сразу же справа от значка, а не по центру. Этот стиль может быть использована только со стилем TCS_FIXEDWIDTH
  • TCS_HOTTRACK - автоматическая подсветка вкладок при наведении мыши
  • TCS_MULTILINE - многосточные вкладки
  • TCS_MULTISELECT - Можно выбрать несколько вкладок, удерживая клавишу CTRL при нажатии. Этот стиль должен использоваться со стилем TCS_BUTTONS
  • TCS_OWNERDRAWFIXED - за перерисовку вкладок отвечает родительское окно
  • TCS_RAGGEDRIGHT - ширина многострочных вкладок не устанавливается равной ширине окна (стиль по умолчанию)
  • TCS_RIGHT - Вкладки отображаются вертикально по правой стороне, при использовании стиля TCS_VERTICAL.Этот стиль не поддерживается, если вы используете визуальные стили
  • TCS_RIGHTJUSTIFY - Ширина каждой вкладки увеличивается при необходимости так, чтобы каждая строка вкладок заполняла всю ширину вкладок. Этот стиль игнорируется, если указан стиль TCS_MULTILINE
  • TCS_SCROLLOPPOSITE - Неиспользуемые ряды вкладок переместить на противоположную сторону элемента при переходе по вкладкам
  • TCS_SINGLELINE - Только одна строка вкладок отображается. Пользователь может делать прокрутку для просмотра вкладок, если это необходимо. Этот стиль по умолчанию
  • TCS_TABS - Обычные вкладки, и обводящая рамка вокруг области элемента. Этот стиль по умолчанию
  • TCS_TOOLTIPS - Элемент Tab имеет всплывающую подсказку вкладки
  • TCS_VERTICAL - Вкладки отображаются вертикально в левой части управления. Этот стиль является действительным только при использовании со стилем TCS_MULTILINE

Сообщения для контрола TAB:

  • TCM_ADJUSTRECT - Рассчитывает области отображения вкладок, данный прямоугольник окна, или вычисляет прямоугольник окна, который соответствовал бы указанной области отображения
  • TCM_DELETEALLITEMS - Удаляет все вкладки из контрола
  • TCM_DELETEITEM - Удаляет вкладку из контрола
  • TCM_DESELECTALL - Сброс элементов в панели закладок, очищает, которые были установлены в TCIS_BUTTONPRESSED
  • TCM_GETCURFOCUS - Возвращает индекс элемента, который имеет фокус на вкладке
  • TCM_GETCURSEL - Определяет выбранную вкладку в панели закладок
  • TCM_GETEXTENDEDSTYLE - Получает расширенные стили, которые используются в настоящее время для управления вкладками
  • TCM_GETIMAGELIST - получает хендл списка изображений, используемый для TAB
  • TCM_GETITEM - Получает информацию о закладке в панели закладок
  • TCM_GETITEMCOUNT - Возвращает количество вкладок в панели закладок
  • TCM_GETITEMRECT - Возвращает ограничивающий прямоугольник для вкладки в панели закладок
  • TCM_GETROWCOUNT - Возвращает текущее количество строк вкладок в в многострочной панели закладок
  • TCM_GETTOOLTIPS - Получает хендл подсказки, связанный с вкладкой
  • TCM_GETUNICODEFORMAT - Получает флаг формата Unicode символов
  • TCM_HIGHLIGHTITEM - Устанавливает выделенное состояние элемента вкладки
  • TCM_HITTEST - Определяет, какие вкладки, если таковые имеются, в указанной позиции экрана
  • TCM_INSERTITEM - Вставляет новую вкладку в панели закладок
  • TCM_REMOVEIMAGE - Удаляет изображение из списка изображений вкладки
  • TCM_SETCURFOCUS - Устанавливает фокус на указанную вкладку в панели закладок
  • TCM_SETCURSEL - Выбор вкладки в панели закладок
  • TCM_SETEXTENDEDSTYLE - Устанавливает расширенные стили
  • TCM_SETIMAGELIST - Подключает список изображений к контролу TAB
  • TCM_SETITEM - Устанавливает некоторые или все атрибуты вкладки
  • TCM_SETITEMEXTRA - Устанавливает число зарезервированных байт для вкладки
  • TCM_SETITEMSIZE - Устанавливает фиксированную ширину и высоту вкладок
  • TCM_SETMINTABWIDTH - Устанавливает минимальную ширину элементов в панели закладок
  • TCM_SETPADDING - Устанавливает отступ вокруг значка каждой вкладки и текста на вкладке управления
  • TCM_SETTOOLTIPS - Назначает подсказку для контрола
  • TCM_SETUNICODEFORMAT - Устанавливает флаг формата Unicode для символов

Получить больше информации по стилям и сообщениям можно в MSDN

Пример с использованием TAB:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"

Dim msg As MSG
Dim As WNDCLASSEX wc
Dim As String NameClass="MyClass"
Dim As HINSTANCE Hinst=GetModuleHandle(0)

Dim As InitCommonControlsEx icex
icex.dwSize = Sizeof(InitCommonControlsEx)
icex.dwICC = ICC_TAB_CLASSES
InitCommonControlsEx(@icex)

Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer

    Static As HWND hwndTab,Static1,Static2
    Select Case msg
        Case WM_CREATE
            ' Узнаем размеры клиентской области главного окна
            Dim As RECT rcClient
            GetClientRect(hwnd, @rcClient)
            ' Создаем контрол TAB
            hwndTab = CreateWindow(WC_TABCONTROL, "", WS_CHILD Or WS_CLIPSIBLINGS Or WS_VISIBLE,0, 0, rcClient.right,rcClient.bottom ,hwnd, Cast(HMENU,1), 0, NULL)
            ' Создаем два дочерних окна для TAB
            Static1 = CreateWindowEx(0,"Static","1 TAB",WS_VISIBLE Or WS_CHILD,10,50,100,20,hwndTab,Cast(HMENU,2),0,0)
            Static2 = CreateWindowEx(0,"Static","2 TAB",WS_VISIBLE Or WS_CHILD,10,70,100,20,hwndTab,Cast(HMENU,3),0,0)
            ' прячем второй STATIC
            ShowWindow(Static2,0)
            ' создаем две вкладки
            Dim As  TCITEM tcitem
            Static As ZString*10 szNameTab(1) = {"1_TAB","2_TAB"}
            For i As Integer = 0 To 1
                With tcitem
                    .mask = TCIF_TEXT Or TCIF_PARAM
                    .pszText=StrPtr(szNameTab(i))
                    .lParam=Cast(LPARAM,hwndTab)
                End With
                TabCtrl_InsertItem(hwndTab, i, @tcitem)
            Next
        Case WM_NOTIFY
            Dim As NMHDR Ptr NM = Cast(NMHDR Ptr,LPARAM)
            If NM->code = TCN_SELCHANGE Then
                ' определяем индекс нажатой вкладки
                Dim As Integer iPage = TabCtrl_GetCurSel(hwndTab)

                If iPage = 0 Then ' если нажата первая вкладка
                    ShowWindow(Static1,1)' отображаем первый STATIC
                    ShowWindow(Static2,0)' прячем второй STATIC
                Elseif iPage = 1 Then ' если нажата вторая вкладка
                    ShowWindow(Static1,0)' прячем первый STATIC
                    ShowWindow(Static2,1)' отображаем второй STATIC
                Endif
            Endif
        Case WM_DESTROY
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_WINLOGO)
    .hCursor=LoadCursor(0,IDC_ARROW)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOW)
    .lpszClassName=StrPtr(NameClass)
    .hIconSm=.hIcon
End With

If RegisterClassEx(@wc)=0 Then
    Print "Register error, press any key"
    Sleep
    End
Endif

CreateWindowEx(0,NameClass,"TAB_CONTOL",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,200,0,0,Hinst,0)

While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend


TAB2.png

содержание | назад | вперед