API и FreeBasic. (дочерние окна-TAB)
TAB или попросту вкладки представляют из себя вереницу кнопок с общей областью, на которой есть возможность разместить необходимые элементы. В результате этого, будет создаваться видимость переключения нескольких страниц для одной области окна. На практике данный контрол применяют довольно часто. Достаточно взглянуть на любой продвинутый текстовый редактор (к пр. Notepad++):
При создании вкладок и их дочерних окон не означает, что вместе с ними автоматически будут переключаться закрепленные с ними окна. При использовании кнопок вкладок, система отправляет соответствующие сообщения родительскому окну, а вся реализация функциональности, которая будет закреплена за вкладками, ложится на плечи программиста. Если по простому, то от программиста требуется:
- создать контрол TAB
- создать нужное кол-во вкладок
- для каждой вкладки создать и прикрутить необходимые дочерние окна
- при отлове сообщений от нажатий вкладок, отображать только те дочерние окна, которые за ней закреплены, остальные спрятать
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
содержание | назад | вперед