LEKCII (1058824), страница 15
Текст из файла (страница 15)
Для создания списка приложение должно вызвать функцию CreateWindow, передав в качестве первого параметра указатель на строку "listbox":
hListBox = CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_WANTKEYBOARDINPUT, 30, 30, 200, 100, hwnd, (HMENU) ID_LIST, hInst, NULL);
Второй параметр функции должен быть указан как NULL.
Дополнительно к стилям окна WS_CHILD и WS_VISIBLE при создании списка указываются специальные стили списка, символические имена которых имеют префикс LBS_.
Остальные параметры функции CreateWindow указываются так же, как и для других органов управления. Параметры с четвертого по седьмой используются для определения расположения и размеров списка. Восьмой параметр - идентификатор родительского окна, в функцию которого будет поступать сообщение WM_COMMAND. Девятый параметр определяет идентификатор списка. Десятый указывает идентификатор копии приложения. Последний параметр должен быть задан как NULL.
Стили списка
Приведем список стилей, которые используются для создания органа управления класса "listbox".
| Имя стиля | Описание |
| LBS_DISABLENOSCROLL | Если в одноколоночном списке помещаются все строки, вертикальная полоса просмотра изображается в неактивном состоянии. Без указания стиля LBS_DISABLENOSCROLL в аналогичной ситуации вертикальная полоса просмотра пропадает. Этот стиль можно указывать для Windows версии 3.1 и более поздних версий |
| LBS_EXTENDEDSEL | Можно выделять не только отдельные строки, но и сразу несколько расположенных рядом строк. Для этого можно использовать клавишу <Shift> или мышь |
| LBS_HASSTRINGS | Создание списка, содержащего строки. Этот стиль используется для всех списков, за исключением тех, которые рисуются родительским окном |
| LBS_MULTICOLUMN | Создание многоколоночного списка. Для того чтобы задать количество колонок, в список необходимо послать сообщение LB_SETCOLUMNWIDTH |
| LBS_MULTIPLESEL | Можно выделять в списке несколько строк сразу. Выделенные строки могут находиться в любом месте списка, а не только рядом (как при использовании стиля LBS_EXTENDEDSEL) |
| LBS_NOINTEGRALHEIGHT | Допустимо частичное отображение строк (например, в нижней части списка можно отображать верхнюю половину строки) |
| LBS_NOREDRAW | Для списка не выполняется перерисовка содержимого при добавлении или удалении строк. Этот стиль может быть динамически добавлен или удален посылкой списку сообщения WM_SETREDRAW |
| LBS_NOTIFY | Родительское окно, создавшее список, получит извещение, если пользователь выполнит в списке двойной щелчок мышью по строке |
| LBS_OWNERDRAWFIXED | Создается список, который рисуется родительским окном, причем все элементы в списке имеют одинаковую высоту |
| LBS_OWNERDRAWVARIABLE | Аналогично предыдущему, но элементы списка могут иметь разную высоту |
| LBS_SORT | Строки списка будут отсортированы |
| LBS_STANDARD | Комбинация наиболее употребительных стилей списка: LBS_NOTIFY, LBS_SORT, WS_BORDER и WS_VSCROLL |
| LBS_USETABSTOPS | При выводе строк списка будет выполняться преобразование символов табуляции. По умолчанию один символ табуляции расширяется на 32 единицы ширины (эти единицы используются в диалоговых панелях) |
| LBS_WANTKEYBOARDINPUT | При использовании этого стиля родительское окно, создавшее список, будет получать сообщения WM_VKEYTOITEM или WM_CHARTOITEM, если список имеет фокус ввода и пользователь работает со списком при помощи клавиатуры |
Для создания простейшего одноколоночного списка имеет смысл использовать стиль LBS_STANDARD. В этом случае, если все строки списка не помещаются в окне, у списка появится вертикальная полоса просмотра. Если при удалении из списка некоторого количества строк размеры окна списка станут достаточны для одновременного отображения всех строк, полоса просмотра исчезнет.
В некоторых случаях такое поведение списка нежелательно, так как оно приводит к изменению внешнего вида списка. Если для списка указать стиль LBS_DISABLENOSCROLL, полоса просмотра будет существовать всегда. Если все строки списка помещаются в окне, эта полоса перейдет в неактивное состояние, но останется на экране.
Иногда нужно сделать так, чтобы добавляемые в список строки отображались в порядке добавления, а не в алфавитном порядке. Для этого не следует указывать стиль LBS_SORT.
Небольшое замечание относительно использования стиля LBS_WANTKEYBOARDINPUT. Если указан этот стиль, то сообщения WM_KEYDOWN и WM_CHAR, получаемые списком (имеющим фокус ввода), создают сообщения WM_VKEYTOITEM или WM_CHARTOITEM. Эти сообщения попадают в функцию родительского окна, благодаря чему последнее может отслеживать операции, выполняемые пользователем над списком при помощи клавиатуры.
Если список имеет стиль LBS_HASSTRINGS, родительское окно будет получать сообщение WM_VKEYTOITEM, а если не имеет - сообщение WM_CHARTOITEM.
Параметр wParam сообщения WM_VKEYTOITEM содержит виртуальный код нажатой клавиши. Например, если пользователь выделит строку в списке и нажмет клавишу <Enter>, родительское окно получит сообщение WM_VKEYTOITEM со значением параметра wParam, равным VK_RETURN. При этом оно может получить из списка выбранную строку и выполнить над ней необходимые действия.
Если родительское окно получает сообщение WM_CHARTOITEM, параметр wParam содержит код символа, соответствующего нажатой клавише.
Коды извещения
Так же как редактор текста, список посылает в родительское окно сообщение WM_COMMAND (если он создан со стилем LBS_NOTIFY). Параметр wParam этого сообщения содержит идентификатор органа управления (в данном случае, идентификатор списка). Младшее слово параметра lParam содержит идентификатор окна списка, а старшее - код извещения.
Приведем список кодов извещения, поступающих от органа управления класса "listbox".
| Код извещения | Описание |
| LBN_DBLCLK | Двойной щелчок левой клавишей мыши по строке списка |
| LBN_ERRSPACE | Ошибка при попытке заказать дополнительную память |
| LBN_KILLFOCUS | Список теряет фокус ввода |
| LBN_SELCANCEL | Пользователь отменил выбор в списке. Это извещение используется в Windows версии 3.1 и более поздних версий |
| LBN_SELCHANGE | Изменился номер выбранной строки (т. е. пользователь выбрал другую строку) |
| LBN_SETFOCUS | Список получает фокус ввода |
Сообщения для списка
Для управления списком приложение посылает ему сообщения, вызывая функцию SendMessage. Эта функция возвращает значение, которое зависит от выполняемой функции или коды ошибок LB_ERRSPACE (ошибка при получении дополнительной памяти), LB_ERR (затребованная операция не может быть выполнена).
В файле windows.h определены сообщения, специально предназначенные для работы со списком. Символические имена этих сообщений имеют префикс LB_. Приведем список таких сообщений.
LB_ADDSTRING
Добавление строки в список.
Параметры:
wParam = 0;
lParam = (LPARAM)(LPCSTR)lpszStr;
lpszStr - указатель на добавляемую строку.
Возвращаемое значение:
Номер строки в списке (первая строка имеет номер 0), или код ошибки.
LB_DELETESTRING
Удаление строки из списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер удаляемой строки. Первая строка имеет номер 0.
Возвращаемое значение:
Количество строк, оставшихся в списке, или код ошибки.
LB_DIR
Заполнение списка именами файлов и каталогов, расположенных в текущем каталоге, а также именами дисков.
Параметры:
wParam = (WPARAM)(UINT)uAttr;
lParam = (LPARAM)(LPCSTR)lpszFileSpec;
uAttr - атрибуты файлов;
lpszFileSpec - указатель на строку, содержащую имя файла или шаблон имени файла.
Возвращаемое значение:
Номер последнего имени файла, добавленного в список, или код ошибки.
LB_FINDSTRING
Поиск строки в списке, имеющей заданный префикс. Будет найдена строка, начальная часть которой совпадает с текстовой строкой, определенной в качестве префикса.
Параметры:
wParam = (WPARAM)nIndexStart;
lParam = (LPARAM)(LPCSTR)lpszStr;
nIndexStart - номер строки, с которой начинается поиск;lpszStr- адрес префикса строки, которую нужно найти в списке.
Возвращаемое значение:
Номер найденной строки, или код ошибки (если строки в списке нет).
Создание списка COMBOBOX
Для того чтобы создать список класса "combobox" приложение должно вызвать функцию CreateWindow, передав в качестве первого параметра указатель на строку "combobox":
hComboBox = CreateWindow("ComboBox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_AUTOHSCROLL | CBS_SIMPLE, 30, 30, 200, 200, hwnd, (HMENU) ID_LIST, hInst, NULL);
Второй параметр функции должен быть указан как NULL.
При создании списка "combobox" указываются специальные стили списка, символические имена которых имеют префикс CBS_.
Остальные параметры функции CreateWindow указываются так же, как и для списка класса "listbox".
Стили списка
Приведем список стилей, которые используются для создания органа управления класса "combobox". Многие из этих стилей вам уже знакомы.
| Имя стиля | Описание |
| CBS_AUTOHSCROLL | Выполняется автоматическая свертка текста по горизонтали в окне редактирования |
| СBS_DISABLENOSCROLL | Если в одноколоночном списке помещаются все строки, вертикальная полоса просмотра изображается в неактивном состоянии. Этот стиль можно указывать для Windows версии 3.1 и более поздних версий |
| CBS_DROPDOWN | Список остается в невидимом состоянии до тех пор, пока пользователь не нажмет пиктограмму, специально предназначенную для отображения списка |
| CBS_DROPDOWNLIST | Аналогично предыдущему, но однострочный текстовый редактор может быть использован только для отображения текста, но не для редактирования |
| СBS_HASSTRINGS | Создание списка, содержащего строки, который рисуется родительским окном |
| СBS_NOINTEGRALHEIGHT | Допустимо частичное отображение строк |
| СBS_OEMCONVERT | При вводе символов в окне редактирования выполняется их преобразование из кодировки ANSI в OEM и обратно. Этот стиль используется только совместно со стилями CBS_SIMPLE и CBS_DROPDOWN |
| СBS_OWNERDRAWFIXED | Создается список, который рисуется родительским окном, причем все элементы в списке имеют одинаковую высоту |
| СBS_OWNERDRAWVARIABLE | Аналогично предыдущему, но элементы списка могут иметь разную высоту |
| СBS_SIMPLE | Создается список, который всегда виден и расположен под окном однострочного редактора текста, содержащего выделенную в списке строку. |
| СBS_SORT | Строки списка будут отсортированы |
Коды извещения













