Сведения о элементах управления tab

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

На следующем снимке экрана показан простой элемент управления tab, содержащий вкладки в течение дней недели. Выбрана вкладка "Вторник".

screen shot of a property sheet with five tabs, one for each day of the week

Этот раздел включает следующие подразделы:

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

Вы можете создать элемент управления tab, вызвав функцию CreateWindowEx , указав класс окна WC_TABCONTROL . Этот класс окна регистрируется при загрузке библиотеки DLL общих элементов управления. Чтобы убедиться, что библиотека DLL загружена, используйте функцию InitCommonControlsEx .

В Microsoft Visual Studio можно создать элемент управления tab с помощью панели элементов.

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

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

Некоторые характеристики можно применить к элементам управления tab, указав стили элементов управления tab при создании элемента управления. Например, можно указать выравнивание и общий внешний вид вкладок в элементе управления tab.

Вы можете привести к тому, что вкладки будут выглядеть как кнопки, указав стиль TCS_BUTTONS . Вкладки в этом типе элемента управления tab должны служить той же функцией, что и элементы управления кнопкой; То есть щелкнув вкладку, следует выполнить команду вместо отображения страницы. Так как область отображения в элементе управления вкладкой кнопки обычно не используется, вокруг нее не рисуется граница.

Вкладка может получить фокус ввода при щелчке, указав стиль TCS_FOCUSONBUTTONDOWN . Этот стиль обычно используется только с TCS_BUTTONS стилем. Можно указать, что вкладка не получает фокус ввода при щелчке с помощью стиля TCS_FOCUSNEVER .

По умолчанию элемент управления tab отображает только одну строку вкладок. Если не все вкладки могут отображаться одновременно, элемент управления tab отображает элемент управления вверх вниз, чтобы пользователь смог прокрутить дополнительные вкладки в представление. При необходимости элемент управления tab может отобразить несколько строк вкладок, указав стиль TCS_MULTILINE . С помощью этого стиля можно одновременно отображать все вкладки. Вкладки выравниваются по левому краю в каждой строке, если не указать стиль TCS_RIGHTJUSTIFY . В этом случае ширина каждой вкладки увеличивается, чтобы каждая строка вкладок заполняла всю ширину элемента управления tab.

Элемент управления табуляции автоматически масштабирует каждую вкладку, чтобы она соответствовала своему значку, если она есть, и ее метку. Чтобы присвоить всем вкладкам одинаковую ширину, можно указать стиль TCS_FIXEDWIDTH . Элемент управления размеров всех вкладок в соответствии с самой широкой меткой или можно назначить определенную ширину и высоту с помощью сообщения TCM_SETITEMSIZE . На каждой вкладке элемент управления центрируется значок и метка, помещая значок слева от метки. Вы можете принудительно установить значок слева, оставив метку по центру, указав стиль TCS_FORCEICONLEFT . Вы можете выровнять значок и метку по левому краю с помощью стиля TCS_FORCELABELLEFT . Стиль TCS_FIXEDWIDTH нельзя использовать с TCS_RIGHTJUSTIFY стилем.

Можно указать, что родительское окно рисует вкладки в элементе управления с помощью стиля TCS_OWNERDRAWFIXED . Дополнительные сведения см. на вкладках", нарисованных владельцем.

Можно указать, что элемент управления tab создаст элемент управления подсказкой с помощью стиля TCS_TOOLTIPS . Дополнительные сведения об этом см. в подсказках элемента управления tab.

Вкладки и атрибуты вкладок

Каждая вкладка в элементе управления вкладкой состоит из значка, метки и данных, определенных приложением. Эти сведения задаются структурой TCITEM . Вы можете добавлять вкладки в элемент управления табуляции, получать количество вкладок, извлекать и задавать содержимое вкладки, а также удалять вкладки. Вкладки идентифицируются по отсчитываемой от нуля индексу.

Чтобы добавить вкладки в элемент управления tab, используйте сообщение TCM_INSERTITEM , указав положение элемента и адрес структуры TCITEM . Вы можете получить и задать содержимое существующей вкладки с помощью TCM_GETITEM и TCM_SETITEM сообщений. Для каждой вкладки можно указать значок, метку или и то, и другое. Вы также можете указать определяемые приложением данные для связывания с вкладкой.

Текущее количество вкладок можно получить с помощью сообщения TCM_GETITEMCOUNT , удалить вкладку с помощью сообщения TCM_DELETEITEM и удалить все вкладки в элементе управления табуляции с помощью сообщения TCM_DELETEALLITEMS .

Данные, определенные приложением, можно связать с каждой вкладкой. Например, можно сохранить сведения о каждой странице с соответствующей вкладкой. По умолчанию элемент управления tab выделяет четыре дополнительных байта на вкладку для данных, определенных приложением. Количество дополнительных байтов на вкладку можно изменить с помощью сообщения TCM_SETITEMEXTRA . Это сообщение можно использовать только в том случае, если элемент управления tab пуст.

Определяемые приложением данные задаются элементом lParam структуры TCITEM . Если вы используете более 4 байтов данных, определенных приложением, необходимо определить собственную структуру и использовать ее вместо TCITEM. Вы можете получать и задавать данные, определяемые приложением, так же, как и получать и задавать другие сведения о вкладке, используя TCM_GETITEM и TCM_SETITEM сообщения.

Первый элемент структуры должен быть структурой TCITEMHEADER , а остальные члены должны указывать определяемые приложением данные. TCITEMHEADER идентичен TCITEM, за исключением того, что он не имеет члена lParam . Разница между размером структуры и размером TCITEMHEADER должна быть равна количеству дополнительных байтов на вкладку.

Область отображения

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

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

Выбор вкладки

Когда пользователь выбирает вкладку, элемент управления tab отправляет коды уведомлений родительского окна в виде сообщений WM_NOTIFY . Код уведомления TCN_SELCHANGING отправляется до изменения выделения, а после изменения выделения отправляется код уведомления TCN_SELCHANGE .

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

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

Вы можете получить и задать текущий выделенный фрагмент с помощью сообщений TCM_GETCURSEL и TCM_SETCURSEL .

Списки изображений элементов управления tab

Каждая вкладка может иметь связанный с ней значок, который указывается индексом в списке изображений для элемента управления tab. При создании элемента управления tab он не связан со списком изображений. Приложение может создать список изображений с помощью функции ImageList_Create , а затем назначить ее элементу управления tab с помощью сообщения TCM_SETIMAGELIST .

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

При уничтожении элемента управления tab список изображений, связанный с ним, не уничтожается. Необходимо уничтожить список изображений отдельно. Это полезно, если вы хотите назначить один и тот же список изображений нескольким элементам управления tab.

Чтобы получить дескриптор в списке изображений, связанном с элементом управления tab, можно использовать сообщение TCM_GETIMAGELIST .

Размер и положение вкладок

Каждая вкладка в элементе управления tab имеет размер и положение. Можно задать размер вкладок, получить ограничивающий прямоугольник вкладки или определить, какая вкладка находится в указанной позиции.

Для элементов управления табуляции фиксированной ширины и владельца можно задать точную ширину и высоту вкладок с помощью сообщения TCM_SETITEMSIZE . В других элементах управления вкладками размер каждой вкладки вычисляется на основе значка и метки для вкладки. Элемент управления tab включает пространство для границы и дополнительного поля. Толщину поля можно задать с помощью сообщения TCM_SETPADDING .

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

В элементе управления tab с стилем TCS_MULTILINE можно определить текущее количество строк вкладок с помощью сообщения TCM_GETROWCOUNT .

Вкладки Owner-Drawn

Если элемент управления tab имеет стиль TCS_OWNERDRAWFIXED , родительское окно должно рисовать вкладки, обрабатывая сообщение WM_DRAWITEM . Элемент управления tab отправляет это сообщение всякий раз, когда нужно нарисовать вкладку. Параметр lParam задает адрес структуры DRAWITEMSTRUCT , содержащей индекс вкладки, ограничивающий прямоугольник и контекст устройства (DC), в котором выполняется рисование.

По умолчанию элемент itemDataобъекта DRAWITEMSTRUCT содержит значение элемента lParam структуры TCITEM . Однако если изменить объем данных, определенных приложением на вкладку, itemData содержит адрес данных. Вы можете изменить объем данных, определенных приложением на вкладку, с помощью сообщения TCM_SETITEMEXTRA .

Чтобы указать размер элементов в элементе управления вкладкой, родительское окно должно обработать сообщение WM_MEASUREITEM . Так как все вкладки в элементе управления "Вкладка владельца" имеют одинаковый размер, это сообщение отправляется только один раз. Стиль элемента управления табуляции для вкладок нарисованных владельцем различных размеров отсутствует. Можно также задать ширину и высоту вкладок с помощью сообщения TCM_SETITEMSIZE .

Подсказки элемента управления tab

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

Если вы используете элемент управления подсказкой с элементом управления tab, родительское окно должно обработать код уведомления TTN_GETDISPINFO , чтобы предоставить описание каждой вкладки по запросу.

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

Обработка сообщений с помощью клавиши TAB по умолчанию

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

Сообщение Обработка выполнена
WM_CAPTURECHANGED Ничего не делает, если элемент управления tab выпустил сам захват мыши. Если другое окно захватило мышь и кнопка удерживается, команда освобождает кнопку.
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 Пересчитывает позиции вкладок и может привести к отмене части элемента управления tab, чтобы принудительно переопределять некоторые или все вкладки.