Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Поле со списком сочетает в себе поле ввода или статический текст и выпадающий список.
В этом разделе содержатся следующие разделы.
- Типы и стили полей со списком
- список комбинированного поля
- изменение полей выбора элемента управления
- Owner-Drawn поля со списком
- Подклассированные поля со списком
Типы и стили комбинированных полей
Комбинированный список состоит из списка и поля выбора. В списке представлены параметры, которые пользователь может выбрать, а поле выбора отображает текущий выбор. Если поле выбора является элементом управления редактированием, пользователь может ввести сведения, недоступные в списке; в противном случае пользователь может выбрать только элементы в списке.
Библиотека общих элементов управления включает три основных стиля выпадающего списка, как показано в следующей таблице.
Тип поля со списком | Константа стиля | Описание |
---|---|---|
Простой | CBS_SIMPLE | Отображает список всегда и отображает выбранный элемент в элементе управления редактированием. |
Раскрывающийся список | CBS_DROPDOWN | Отображает список при щелчке значка и отображает выбранный элемент в элементе управления редактирования. |
Раскрывающийся список (выпадающий список) | CBS_DROPDOWNLIST | Отображает список при щелчке значка и отображает выбранный элемент в статическом элементе управления. |
На следующих снимках экрана показаны три вида поля со списком, какие они могут быть в Windows Vista. На первом скриншоте пользователь выбрал элемент в простом поле со списком. Пользователь также может ввести новое значение в поле редактирования этого элемента управления. Список был настроен в редакторе ресурсов Microsoft Visual Studio и имеет размер, достаточный для размещения двух элементов.
Во втором снимке экрана пользователь ввел новый текст в поле редактирования выпадающего списка. Пользователь также мог выбрать существующий элемент. Поле списка расширяется, чтобы разместить максимальное количество элементов.
снимок экрана
На третьем снимке экрана пользователь открыл раскрывающийся список. Поле списка расширяется, чтобы разместить максимальное количество элементов. Пользователь не может ввести новый текст.
Существует также ряд стилей выпадающих списков, определяющих конкретные свойства. Стили комбинированных списков задают конкретные свойства этих списков. Вы можете комбинировать стили; однако некоторые стили применяются только к определенным типам комбинированных полей. Таблицу стилей комбинированного списка см. в разделе Стили комбинированных списков.
Заметка
Чтобы использовать визуальные стили с полями со списком, приложение должно включать манифест и вызывать InitCommonControls в самом начале программы. Сведения о стилях визуальных элементов см. в стилей визуальных элементов. Для получения информации о манифестах см. раздел Включение визуальных стилей.
Комбинированный список
Список — это часть комбинированного списка, в котором отображаются элементы, которые пользователь может выбрать. Как правило, при создании поля со списком приложение инициализирует содержимое списка. Любой элемент списка, выбранный пользователем, является текущим выбором. Не удается выбрать несколько элементов. В простых и выпадающих комбинированных полях пользователь может вводить текст вместо выбора элемента списка. В таких случаях нет текущего выбора, и приложение должно добавить элемент в список и сделать его текущим выбором, если это необходимо сделать.
В этом разделе рассматриваются следующие разделы:
Текущий выбор
Текущий выбор — это элемент списка, выбранный пользователем; выделенный текст отображается в поле выбора комбинированного списка. Однако в случае простого комбинированного поля или раскрывающегося комбинированного поля текущий выбор является только одной из форм возможного ввода пользователя в комбинированное поле. Пользователь также может вводить текст в поле выбора.
Текущий выбор определяется отсчитываемым от нуля индексом выбранного элемента списка. Приложение может установить и получить его в любое время. Процедура родительского окна или диалогового окна получает уведомление, когда пользователь изменяет текущий выбор для поля со списком. Родительское окно или диалоговое окно не уведомляется при изменении выбора в приложении.
При создании комбинированного списка отсутствует текущий выбор. Это также верно для простого или выпадающего комбобокса, если пользователь редактировал содержимое поля выбора. Чтобы задать текущий выбор, приложение отправляет CB_SETCURSEL сообщение для комбинированного поля. Приложение также может использовать сообщение CB_SELECTSTRING, чтобы задать текущий выбор элементу списка, строка которого начинается с указанной строки. Чтобы определить текущий выбор, приложение отправляет сообщение CB_GETCURSEL в комбинированное поле. Если текущего выбора нет, это сообщение возвращает CB_ERR.
Когда пользователь изменяет текущий выбор в поле со списком, родительская процедура или процедура диалогового окна получает сообщение WM_COMMAND с кодом уведомления CBN_SELCHANGE в слове высокого порядка параметра wParam. Этот код уведомления не отправляется, если текущий выбор установлен с помощью сообщения CB_SETCURSEL.
Комбинированный список или раскрывающийся список отправляет код уведомления CBN_CLOSEUP в родительское окно или процедуру диалогового окна при закрытии списка. Если пользователь изменил текущий выбор, комбинированный список отправляет также код уведомления CBN_SELCHANGE при закрытии раскрывающегося списка. Чтобы выполнить определенный процесс каждый раз, когда пользователь выбирает элемент списка, можно обрабатывать либо уведомление кода CBN_SELCHANGE, либо CBN_CLOSEUP. Как правило, вы ожидаете код уведомления CBN_CLOSEUP, прежде чем обрабатывать изменение в текущем выборе. Это может быть особенно важно, если требуется значительный объем обработки.
Приложение также может обрабатывать коды уведомлений CBN_SELENDOK и CBN_SELENDCANCEL. Система отправляет CBN_SELENDOK, когда пользователь выбирает элемент списка или выбирает элемент, а затем закрывает список. Это указывает на то, что пользователь завершил действия, и выборка должна быть обработана. CBN_SELENDCANCEL отправляется, когда пользователь выбирает элемент, но затем выбирает другой элемент управления, нажимает esc во время открытия раскрывающегося списка или закрывает диалоговое окно. Это означает, что выбор пользователя должен игнорироваться. CBN_SELENDOK отправляется перед каждым сообщением CBN_SELCHANGE.
В простом поле со списком система отправляет код уведомления CBN_DBLCLK, когда пользователь дважды щелкает элемент списка. В выпадающем комбинированном списке или раскрывающемся списке один щелчок скрывает список, поэтому дважды щелкнуть элемент невозможно.
Раскрывающиеся списки
Некоторые уведомления и сообщения применяются только к комбинированным полям с выпадающими списками. Когда раскрывающийся список открыт или закрыт, родительское окно комбинированного поля получает уведомление в виде сообщения WM_COMMAND. Если список открывается, старшее слово wParam — это CBN_DROPDOWN. Если список закрывается, это CBN_CLOSEUP.
Приложение может открыть список комбинированного списка или раскрывающегося списка с помощью сообщения CB_SHOWDROPDOWN. Он может определить, открыт ли список с помощью сообщения CB_GETDROPPEDSTATE и может определить координаты раскрывающегося списка с помощью сообщения CB_GETDROPPEDCONTROLRECT. Приложение также может увеличить ширину раскрывающегося списка с помощью сообщения CB_SETDROPPEDWIDTH.
Содержимое списка
Когда приложение создает комбинированный список, оно обычно инициализирует его путем добавления одного или нескольких элементов в список. Позже приложение может добавлять или удалять элементы списка, повторно инициализировать список или извлекать из него сведения об элементах.
Приложение добавляет элементы списка в поле со списком, отправляя в него сообщение CB_ADDSTRING. Указанный элемент добавляется в конец списка или, в отсортированное поле со списком, в нужную позицию на основе строки элемента. В несортированном поле со списком приложение может использовать сообщение CB_INSERTSTRING для вставки элемента на определенной позиции. После добавления элемент списка определяется его положением.
С помощью сообщения CB_FINDSTRING или CB_FINDSTRINGEXACT приложение может определить положение элемента списка. CB_FINDSTRING находит элемент, строка которого начинается с указанной строки. CB_FINDSTRINGEXACT находит элемент, строка которого точно соответствует строке. Ни одно из сообщений не чувствительно к регистру.
Приложение может удалить элемент списка с помощью сообщения CB_DELETESTRING. Если приложению необходимо повторно инициализировать выпадающий список, оно может сначала очистить все содержимое с помощью сообщения CB_RESETCONTENT. При добавлении нескольких элементов в список после отображения комбинированного списка, приложение может очистить флаг перерисовки, чтобы предотвратить перерисовку комбинированного списка после добавления каждого элемента. Дополнительные сведения о перерисовке см., в описании сообщения WM_SETREDRAW.
Чтобы получить строку, связанную с элементом списка, приложение может использовать сообщение CB_GETLBTEXT. Строка элемента копируется в буфер, указанный приложением. Чтобы убедиться, что буфер достаточно велик для получения строки, приложение может сначала использовать сообщение CB_GETLBTEXTLEN для определения длины строки. Чтобы получить количество элементов списка в поле со списком, приложение может использовать сообщение CB_GETCOUNT.
Изменение полей выбора элемента управления
Приложение может получить или задать содержимое поля выбора, а также определить или установить область редактирования. Приложение также может ограничить объем текста, который пользователь может ввести в поле выбора. При изменении содержимого поля выбора система отправляет уведомления в родительское окно или процедуру диалогового окна.
Чтобы получить содержимое поля выбора, приложение может отправить сообщение WM_GETTEXT в комбинированный список. Чтобы задать содержимое поля выбора простого или раскрывающегося списка, приложение может отправить WM_SETTEXT сообщение в комбинированный список.
Выбор редактирования — это диапазон выделенного текста, если таковой имеется, в поле выбора простого или раскрывающегося списка. Приложение может определить начальные и конечные позиции символов текущего выделения с помощью сообщения CB_GETEDITSEL. Он также может выбирать символы в выделенном фрагменте редактирования с помощью сообщения CB_SETEDITSEL.
Изначально объем текста, который пользователь может ввести в поле выбора, ограничен размером поля выделения. Однако если поле со списком имеет стиль CBS_AUTOHSCROLL, текст может продолжаться за пределы поля выбора. Приложение может использовать сообщение CB_LIMITTEXT, чтобы ограничить объем текста, который пользователь может ввести в поле выбора независимо от того, имеет ли элемент управления стиль CBS_AUTOHSCROLL.
Когда пользователь изменяет содержимое поля выбора, родительская или диалоговая процедура получает уведомления. Сначала отправляется код уведомления CBN_EDITUPDATE, указывающий, что текст в поле выделения был изменен. После отображения измененного текста система отправляет CBN_EDITCHANGE. Если содержимое поля выбора изменяется в результате выбора элемента списка, эти сообщения не отправляются.
Owner-Drawn комбинированные списки
Приложение может создать владеемый комбинированный список, чтобы взять на себя ответственность за рисование элементов списка. Родительское окно отрисовываемого владельцем поля со списком (его владельцем) получает сообщения WM_DRAWITEM, когда часть поля со списком должна быть окрашена. Пользовательский выпадающий список может перечислять информацию не только в виде текстовых строк, но также и помимо них. Разрабатываемые владельцем выпадающие списки могут быть любого типа. Однако элемент управления редактирования в простом или комбинированном поле может отображать только текст, в то время как владелец управляет отображением поля выбора в раскрывающемся списке.
Владелец пользовательского комбинированного списка должен обработать сообщение WM_DRAWITEM. Это сообщение отправляется каждый раз, когда часть поля со списком должна быть перерисована. Владельцу может потребоваться обрабатывать другие сообщения в зависимости от стилей, указанных для поля со списком.
Приложение может создать поле со списком, нарисованное владельцем, указав стиль CBS_OWNERDRAWFIXED или CBS_OWNERDRAWVARIABLE. Если все элементы списка в раскрывающемся списке имеют одинаковую высоту, например, текстовые строки или значки, приложение может использовать стиль CBS_OWNERDRAWFIXED. Если элементы списка имеют различную высоту, например растровые изображения разного размера, приложение может использовать стиль CBS_OWNERDRAWVARIABLE.
Владелец пользовательского комбинированного списка может обработать сообщение WM_MEASUREITEM, чтобы указать размеры элементов списка в комбинированном списке. Если приложение создает комбинированный список с помощью стиля CBS_OWNERDRAWFIXED, система отправляет сообщение WM_MEASUREITEM только один раз. Измерения, указанные владельцем, используются для всех элементов списка. Если используется стиль CBS_OWNERDRAWVARIABLE, система отправляет WM_MEASUREITEM сообщение для каждого элемента списка, добавленного в комбинированный список. Владелец может определить или задать высоту элемента списка в любое время с помощью CB_GETITEMHEIGHT и CB_SETITEMHEIGHT сообщений соответственно.
Если сведения, отображаемые в комбинированном списке с пользовательским рисованием, содержат текст, приложение может отслеживать текст для каждого элемента списка, указав стиль CBS_HASSTRINGS. Комбинированные списки со стилем CBS_SORT сортируются в соответствии с этим текстом. Если поле со списком отсортировано и не имеет стиля CBS_HASSTRINGS, владелец должен обработать сообщение WM_COMPAREITEM.
В комбинированном списке, созданном владельцем, владелец должен следить за элементами списка, которые содержат информацию, отличную от текста или дополненную текстом. Одним из удобных способов этого является сохранение дескриптора в качестве данных элемента. Чтобы освободить объекты данных, связанные с элементами в поле со списком, владелец может обработать сообщение WM_DELETEITEM.
Комбинированные списки с подклассами
Подклассификация — это процедура, которая позволяет приложению перехватывать и обрабатывать сообщения, отправленные или посланные в окно. Используя подклассы, приложение может заменить собственную обработку для определенных сообщений, оставляя большую часть обработки сообщений в процедуре определенного класса окна.
При создании окна операционная система сохраняет сведения о нем во внутренней структуре данных, которая включает указатель на процедуру окна. Для подкласса окна приложение вызывает функцию SetClassLong, чтобы заменить указатель на эту процедуру указателем на определяемую приложением процедуру подкласса. После этого все сообщения в окно отправляются в процедуру подкласса. Затем эта процедура использует функцию CallWindowProc для передачи необработанных сообщений в исходную процедуру окна. Описание обработки сообщений, выполняемой процедурой окна класса COMBOBOX, смотрите в разделе Поведение комбобокса по умолчанию.
Если поле со списком выходит за рамки диалогового окна, приложение не может обрабатывать клавиши TAB, ВВОД и ESC, если не используется процедура подкласса. Когда простое поле со списком или раскрывающимся списком получает фокус ввода, он сразу же устанавливает фокус на его дочерний элемент управления редактирования. Поэтому приложение должно создать подкласс элемента управления редактором, чтобы перехватить ввод с клавиатуры для простого или раскрывающегося комбинированного списка. Пример этого см. в разделе "Подклассирование поля со списком".
Если процедура подкласса обрабатывает сообщение WM_PAINT, он должен использовать функцию BeginPaint для подготовки к рисованию. Перед вызовом функции EndPaint он передает дескриптор контекста устройства (DC) в качестве параметра wParam для процедуры окна. Если EndPaint вызывается первым, процедура окна класса не выполняет рисование, так как EndPaint проверяет все окно.
Метод, связанный с подклассами, является суперклассированием. Суперкласс напоминает любой другой класс, за исключением того, что его процедура окна не вызывает DefWindowProc для обработки необработанных сообщений. Вместо этого он передает необработанные сообщения в процедуру окна для родительского класса окна. Следуйте инструкциям в процедурах окна, чтобы избежать проблем, которые могут возникнуть с подклассами и суперклассами.