Окно-список представляет собой прямоугольник, внутри которого находится листаемый список из текстовых строк. Пользователь может выделять строки списка при помощи курсора. Окно-список может использоваться для просмотра и выбора элементов древовидного списка , например имен файлов на диске.
Программа может добавлять и удалять отдельные строки списка, передавая специальные сообщения функции окна-списка. Эти сообщения будут описаны ниже. Окно-список, в свою очередь, передает сообщение WM_COMMAND функции родительского окна при выборе пользователем элемента списка с помощью клавиш PageUp, PageDown, клавиш управления курсором или мышью.
Как и все органы управления, описанные выше, окно-список является дочерним окном. Для создания окна-списка необходимо воспользоваться предопределенным классом окна «listbox». По умолчанию окно-список не передает сообщения WM_COMMAND при выборе элемента списка. Чтобы сообщение передавалось, добавьте идентификатор LBS_NOTIFY к типам окна-списка. Если требуется, чтобы элементы списка изображались в алфавитном порядке, при создании окна указывается флаг LBS_SORT. По умолчанию окно-список отображается без рамки и без вертикальной полосы просмотра. Чтобы отобразить рамку и полосу просмотра, используйте идентификаторы WS_BORDER и WS_VSCROLL. Можно использовать также типы окон WS_SIZEBOX и WS_CAPTION, описанные выше.
Приведем полный перечень флагов окна-списка:
LBS_EXTENDEDSEL
В оке-списке, пользуясь клавишами Shift, мышью или другими комбинациями клавиш, можно делать множественный выбор.
LBS_HASSTRINGS
Определяет «пользовательское» окно-список, т.е. список, который может содержать произвольные строки. Функция окна-списка поддерживает это окно (управляет памятью под строки, скроллингом строк и т.п.). Приложение может заполнять строками окно-список и извлекать из него строки при помощи сообщения LB_GETTEXT.
LBS_MULTICOLUMN
Определяет многостолбцовое окно-список, которое может осуществлять горизонтальный скроллинг. При помощи сообщения LB_SETCOLUMNWIDTH можно устанавливать количество столбцов.
LBS_MULTIPLESEL
Окно-список множественного выбора: нажатием на клавишу мыши или пробел состояние элемента списка меняется с выбранного на невыбранное и наоборот вне зависимости от состояния других элементов.
LBS_NOINTEGRALHEIGHT
Размер окна-списка в точности равен размеру, указанному при создании окна-списка (обычно Windows слегка подгоняет размер окна-списка так, чтобы отображалось целое число элементов).
LBS_NOREDRAW
Изменения, произведенные с самим списком, не отражаются автоматически в окне. Это состояние окна-списка весьма нетипично; оно может быть сброшено в любой момент посылкой сообщения WM_SETREDRAW.
LBS_NOTIFY
Родительское окно получает информацию о любом действии пользователя над списком.
LBS_OWNERDRAWFIXED
Отображение содержимого окна возлагается на функцию родительского окна; элементы окна-списка должны иметь одинаковую высоту.
LBS_OWNERDRAWVARIABLE
Отображение содержимого окна возлагается на функцию родительского окна; элементы окна-списка могут иметь разную высоту.
LBS_SORT
Строки-элементы окна-списка автоматически сортируются по алфавиту.
LBS_STANDART
Наиболее часто используемый стиль; является комбинацией флагов WS_BORDER, WS_VSCROLL, LBS_NOTIFY и LBS_SORT.
LBS_USETABSTOPS
При помещении в окно-список, символы табуляции заменяются на пробелы. По умолчанию один символ табуляции заменяется на 32 «диалоговые единицы». «Диалоговые единицы» исчисляются по высоте и ширине системного шрифта. Определить, чему равна диалоговая единица, можно при помощи функции GetDialogBaseUnits.
LBS_WANTKEYBOARDINPUT
Функция, ответственная за отрисовку окна-списка. Когда окно-список имеет фокус ввода, получает сообщения WM_VKEYTOITEM или WM_CHARTOITEM при любом нажатии клавиш. Этот стиль используется для сложной нестандартной обработки списков.