Сведения о элементах управления tab
Элемент управления вкладками аналогичен закладкам в тетради или ярлыкам в файловом шкафу. С помощью элемента управления вкладкой приложение может определить несколько страниц для одной области окна или диалогового окна. Каждая страница состоит из определенного типа сведений или группы элементов управления, отображаемых приложением, когда пользователь выбирает соответствующую вкладку.
На следующем снимке экрана показана простая панель вкладок, содержащая вкладки для дней недели. Выбрана вкладка "Вторник".
Этот раздел содержит следующие разделы.
- создание элементов управления вкладками
- Стили элементов управления табуляции
- Вкладки и атрибуты вкладок
- область отображения
- Выбор вкладки
- Списки изображений для элемента управления вкладками
- размер и позиция табуляции
- Owner-Drawn вкладки
- подсказки вкладки
- Обработка сообщений элемента управления вкладками по умолчанию
Создание элементов управления tab
Вы можете создать элемент управления tab, вызвав функцию CreateWindowEx, указав класс окна WC_TABCONTROL. Этот класс окна регистрируется при загрузке DLL общих элементов управления. Чтобы убедиться, что библиотека DLL загружена, используйте функцию InitCommonControlsEx.
В Microsoft Visual Studio можно создать элемент управления вкладками с помощью Панели элементов.
Вы отправляете сообщения элементу управления вкладками для добавления вкладок и воздействия на внешний вид и поведение элемента управления. Каждое сообщение имеет соответствующий макрос, который можно использовать вместо явной отправки сообщения. Вы не можете отключить отдельную вкладку в элементе управления вкладками. Однако вы можете отключить элемент управления вкладкой на листе свойств, отключив соответствующую страницу.
Стили элементов управления TAB
Некоторые характеристики можно применить к элементам управления вкладками, указав их стили при создании. Например, можно указать выравнивание и общий вид вкладок в контроле вкладок.
Вы можете привести к тому, что вкладки будут выглядеть как кнопки, указав стиль TCS_BUTTONS. Вкладки в этом типе панели должны служить той же функции, как кнопки; то есть, кликнув на вкладку, нужно выполнить команду вместо отображения страницы. Так как область отображения в элементе управления вкладкой кнопки обычно не используется, границы вокруг нее не рисуется.
Можно заставить вкладку получать фокус ввода при щелчке, указав стиль TCS_FOCUSONBUTTONDOWN. Этот стиль обычно используется только с TCS_BUTTONS стилем. Можно указать, что вкладка не получает фокус ввода при щелчке на нее, используя стиль TCS_FOCUSNEVER.
По умолчанию элемент управления tab отображает только одну строку вкладок. Если не все вкладки могут отображаться одновременно, элемент управления вкладками отображает элемент управления прокруткой, чтобы пользователь смог прокрутить дополнительные вкладки в поле зрения. При необходимости можно вызвать отображение нескольких строк вкладок, указав стиль TCS_MULTILINE. С помощью этого стиля все вкладки могут отображаться одновременно. Вкладки выравниваются по левому краю в каждой строке, если не указать стиль TCS_RIGHTJUSTIFY. В данном случае ширина каждой вкладки увеличивается, чтобы каждая строка вкладок заполняла всю ширину элемента управления.
Элемент управления вкладки автоматически размерирует каждую вкладку, чтобы она соответствовала значку, если она есть, и ее метки. Чтобы предоставить все вкладки одинаковой ширины, можно указать стиль TCS_FIXEDWIDTH. Элемент управления изменяет размер всех вкладок, чтобы соответствовать самой широкой метке, или можно назначить определенную ширину и высоту с помощью сообщения TCM_SETITEMSIZE. В каждой вкладке элемент управления выравнивает знак и метку, располагая знак слева от метки. Вы можете поместить значок слева, оставляя метку по центру, указав стиль TCS_FORCEICONLEFT. Вы можете выровнять значок и метку по левому краю с помощью стиля TCS_FORCELABELLEFT. Стиль TCS_FIXEDWIDTH нельзя использовать вместе со стилем TCS_RIGHTJUSTIFY.
Можно указать, что родительское окно рисует вкладки в элементе управления с помощью стиля TCS_OWNERDRAWFIXED. Дополнительные сведения см. в Owner-Drawn вкладки.
Можно указать, что элемент управления вкладкой создаст элемент управления подсказкой, используя стиль TCS_TOOLTIPS. Дополнительные сведения об этом см. в подсказках управления вкладками.
Вкладки и атрибуты вкладок
Каждая вкладка в элементе управления вкладки состоит из значка, метки и данных, определенных приложением. Эти сведения указываются с помощью структуры TCITEM. Вы можете добавлять вкладки в элемент управления вкладками, получать количество вкладок, извлекать и задавать содержимое вкладки, а также удалять вкладки. Вкладки определяются их отсчитываемым от нуля индексом.
Чтобы добавить вкладки в элемент управления вкладками, используйте сообщение TCM_INSERTITEM, указав положение элемента и адрес структуры TCITEM. Вы можете получить и задать содержимое существующей вкладки с помощью TCM_GETITEM и TCM_SETITEM сообщений. Для каждой вкладки можно указать значок, метку или оба. Вы также можете указать определяемые приложением данные для связывания с вкладкой.
Текущее количество вкладок можно получить с помощью сообщения TCM_GETITEMCOUNT, удалить вкладку с помощью сообщения TCM_DELETEITEM и удалить все вкладки в элементе управления вкладки с помощью сообщения TCM_DELETEALLITEMS.
С каждой вкладкой можно связать определяемые приложением данные. Например, можно сохранить сведения о каждой странице с соответствующей вкладкой. По умолчанию элемент управления tab выделяет четыре дополнительных байта на вкладку для данных, определенных приложением. Количество дополнительных байтов на вкладку можно изменить с помощью сообщения TCM_SETITEMEXTRA. Это сообщение можно использовать только в том случае, если элемент управления вкладки пуст.
Определяемые приложением данные определяются lParam элементом структуры TCITEM. Если вы используете более 4 байтов данных, определенных приложением, необходимо определить собственную структуру и использовать ее вместо TCITEM. Вы можете получать и задавать данные, определенные приложением, так же, как и получать и задавать другие сведения о вкладке, используя TCM_GETITEM и TCM_SETITEM сообщения.
Первый элемент вашей структуры должен быть структурой TCITEMHEADER, а остальные элементы должны указывать данные, определяемые приложением. TCITEMHEADER идентичен TCITEM, за исключением члена lParam. Разница между размером вашей структуры и размером TCITEMHEADER должна равняться числу дополнительных байтов на каждую вкладку.
Область отображения
Область отображения элемента управления вкладкой — это область, в которой приложение отображает текущую страницу. Как правило, приложение создает дочернее окно или диалоговое окно, задав размер окна и положение для соответствия области отображения. Учитывая прямоугольник окна для контрола табуляции, можно вычислить ограничивающий прямоугольник области отображения с помощью сообщения TCM_ADJUSTRECT.
Иногда область отображения должна иметь определенный размер, например размер безрежимного дочернего диалогового окна. Учитывая ограничивающий прямоугольник для области отображения, можно использовать TCM_ADJUSTRECT для вычисления соответствующего прямоугольника окна для элемента управления вкладками.
Выбор вкладки
Когда пользователь выбирает вкладку, элемент управления вкладки отправляет коды уведомлений родительского окна в виде сообщений WM_NOTIFY. Код уведомления TCN_SELCHANGING отправляется до изменения выделения, а код уведомления TCN_SELCHANGE отправляется после изменения выделения.
Вы можете обработать TCN_SELCHANGING, чтобы сохранить состояние исходящей страницы. Вы можете вернуть TRUE, чтобы предотвратить изменение выделения. Например, вы можете не захотеть переключаться с дочернего диалогового окна, в котором элемент управления имеет недопустимый параметр.
Чтобы отобразить входящую страницу в области экрана, необходимо обработать TCN_SELCHANGE. Это может просто влечь за собой изменение сведений, отображаемых в дочернем окне. Чаще каждая страница состоит из дочернего окна или диалогового окна. В этом случае приложение может обработать это уведомление путем уничтожения или скрытия исходящего дочернего окна или диалогового окна, а также создания или отображения входящего дочернего окна или диалогового окна.
Вы можете получить и задать текущий выбор с помощью TCM_GETCURSEL и TCM_SETCURSEL сообщений.
Списки изображений для таб-контрола
Каждая вкладка может иметь значок, связанный с ним, который указывается индексом в списке изображений для элемента управления вкладкой. Когда элемент управления вкладки создается, он не связан со списком изображений. Приложение может создать список изображений с помощью функции ImageList_Create, а затем назначить ее элементу управления tab с помощью сообщения TCM_SETIMAGELIST.
Вы можете добавить изображения в список изображений вкладки так же, как и в любой другой список изображений. Однако приложение должно удалять изображения с помощью сообщения TCM_REMOVEIMAGE вместо функции ImageList_Remove. Это сообщение гарантирует, что каждая вкладка остается связанной с тем же изображением, что и раньше.
При уничтожении элемента управления вкладки список изображений, связанный с ним, не уничтожается. Необходимо уничтожить список изображений отдельно. Это полезно, если вы хотите назначить один и тот же список изображений нескольким вкладкам управления.
Чтобы получить дескриптор списка изображений, который в данный момент связан с элементом управления вкладками, можно использовать сообщение TCM_GETIMAGELIST.
Размер и позиция вкладок
Каждая вкладка в элементе управления вкладки имеет размер и позицию. Вы можете задать размер вкладок, получить ограничивающий прямоугольник вкладки или определить, какая вкладка находится в указанной позиции.
Для элементов управления вкладками с фиксированной шириной и пользовательской отрисовкой можно задать точную ширину и высоту вкладок с помощью сообщения TCM_SETITEMSIZE. В других элементах управления вкладками размер каждой вкладки вычисляется на основе значка и метки для вкладки. Элемент управления tab включает пространство для границы и дополнительного поля. Толщину поля можно задать с помощью сообщения TCM_SETPADDING.
Вы можете определить текущий ограничивающий прямоугольник для вкладки с помощью сообщения TCM_GETITEMRECT. Вы можете определить, какая вкладка находится в указанном расположении с помощью сообщения TCM_HITTEST.
В элементе управления вкладки с стилем TCS_MULTILINE можно определить текущее количество строк вкладок с помощью сообщения TCM_GETROWCOUNT.
Вкладки Owner-Drawn
Если элемент управления вкладки имеет стиль TCS_OWNERDRAWFIXED, родительское окно должно нарисовать вкладки, обрабатывая сообщение WM_DRAWITEM. Элемент управления вкладки отправляет это сообщение всякий раз, когда вкладка должна быть окрашена. Параметр lParam задает адрес структуры DRAWITEMSTRUCT, которая содержит индекс вкладки, ограничивающую рамку и контекст устройства (DC), в котором должна происходить отрисовка.
По умолчанию член itemData структуры DRAWITEMSTRUCT содержит значение члена lParam структуры TCITEM. Однако, если изменить объем данных, определенных приложением для каждой вкладки, itemData вместо этого содержит адрес данных. Вы можете изменить объем данных, задаваемых приложением для каждой вкладки, с помощью сообщения TCM_SETITEMEXTRA.
Чтобы указать размер элементов в элементе управления вкладкой, родительское окно должно обработать сообщение WM_MEASUREITEM. Так как все вкладки в элементе управления вкладки с изображением владельца имеют одинаковый размер, это сообщение отправляется только один раз. Для вкладок, созданных владельцем и с различными размерами, не существует стиля управления. Вы также можете задать ширину и высоту вкладок с помощью сообщения TCM_SETITEMSIZE.
Подсказки элемента управления вкладкой
С помощью элемента управления подсказки можно указать краткое описание каждой вкладки в элементе управления вкладками. Элемент управления tab, имеющий стиль TCS_TOOLTIPS, создает элемент управления подсказки при его создании и уничтожает элемент управления подсказки при его уничтожении. Вы также можете создать элемент управления подсказки и назначить его управлению вкладками.
Если вы используете элемент управления всплывающей подсказкой с элементом управления вкладками, родительское окно должно обработать код уведомления TTN_GETDISPINFO, чтобы предоставить описание каждой вкладки по запросу.
Чтобы использовать один и тот же элемент управления подсказками с несколькими элементами управления вкладками, создайте элемент управления подсказками самостоятельно и назначьте его элементу управления вкладками с помощью сообщения TCM_SETTOOLTIPS. Вы можете получить дескриптор текущего элемента управления подсказками вкладки с помощью сообщения TCM_GETTOOLTIPS. При создании собственного элемента управления подсказки не следует использовать стиль TCS_TOOLTIPS.
Обработка сообщений элемента управления вкладками по умолчанию
В этом разделе описывается обработка сообщений, выполняемая элементом управления tab. Сообщения, относящиеся к элементам управления вкладками, рассматриваются в других разделах этой документации.
Сообщение | Обработка выполнена |
---|---|
WM_CAPTURECHANGED | Не делает ничего, если элемент управления вкладкой сам снял захват мыши. Если в другом окне захвачена мышь и кнопка удерживается, команда освобождает кнопку. |
WM_CREATE | Выделяет и инициализирует внутреннюю структуру данных. Элемент управления создает элемент управления подсказки, если указан стиль TCS_TOOLTIPS. |
WM_DESTROY | Освобождает ресурсы, выделенные во время обработки WM_CREATE. |
WM_GETDLGCODE | Возвращает сочетание значений DLGC_WANTARROWS и DLGC_WANTCHARS. |
WM_GETFONT | Возвращает дескриптор шрифта, используемого для меток. |
WM_KEYDOWN | Обрабатывает ключи направления и изменяет выделение при необходимости. |
WM_KILLFOCUS | Отменяет вкладку с фокусом, чтобы она была переопределена для отражения нефокусированного состояния. |
WM_LBUTTONDOWN | Перенаправляет сообщение в элемент управления всплывающей подсказки, если он есть, и изменяет выбор, если пользователь щелкает по вкладке. Если пользователь нажимает кнопку, элемент управления перерисовывает кнопку, чтобы придать ей вдавленный вид и захватывает управление мышью. Если пользователь нажимает вкладку или кнопку, а стиль TCS_FOCUSONBUTTONDOWN указан, элемент управления задает фокус для себя. |
WM_LBUTTONUP | Освобождает мышь, если нажата кнопка. Если курсор находится над кнопкой и она нажата, элемент управления изменяет выделение соответствующим образом и перерисовывает кнопку. |
WM_MOUSEMOVE | Перенаправляет сообщение в элемент управления подсказки, если таковой есть. Если указан стиль TCS_BUTTONS и кнопка мыши удерживается после нажатия, элемент управления также может перерисовать затронутую кнопку, чтобы придать ей выпуклый или вогнутый вид. |
WM_NOTIFY | Пересылает коды уведомлений, отправленные элементом управления подсказки. |
WM_PAINT | Рисует границу вокруг области отображения (если не указан стиль TCS_BUTTONS) и закрашивает все вкладки, пересекающие недопустимый прямоугольник. Для каждой вкладки она рисует текст вкладки (или отправляет WM_DRAWITEM сообщение в родительское окно), а затем рисует границу вокруг вкладки. Если параметр wParam имеет значение, отличное от NULL, элемент управления предполагает, что значение является HDC и красит с помощью этого контекста устройства. |
WM_RBUTTONDOWN | Отправляет код уведомления NM_RCLICK в родительское окно. |
WM_SETFOCUS | Отменяет вкладку с фокусом, чтобы она была переопределена, чтобы отразить фокусное состояние. |
WM_SETFONT | Задает шрифт, используемый для меток. |
WM_SETREDRAW | Задает состояние внутреннего флага, определяющего, будет ли элемент управления перезапущен при вставке и удалении элементов, при изменении шрифта и т. д. |
WM_SIZE | Пересчитывает позиции вкладок и может сделать часть элемента управления вкладками недействительной, чтобы принудительно перерисовать некоторые или все вкладки. |