Рассмотрим сообщения, которые могут посылать родительские окна окнам списков для их заполнения и дальнейшей работы с ними
После создания окна списка в него следует добавить строки текста – элементы списка. Это делается при помощи функции SendMessage посредством отправки сообщений окну списка. Ссылка на строку текста (на элемент) обычно осуществляется через индекс, который начинается с 0, что соответствует самому верхнему элементу списка.
Специфических сообщений, которые родительское окно может послать окну списка при помощи функции SendMessage, достаточно много. Рассмотрим наиболее часто употребляемые:
- LB_ADDSTRING - для добавления строки в конец списка или по алфавитному порядку (последнее - если используется стиль LBS_SORT);
- LB_INSERTSTRING -для вставки строки на определенное порядковое место в списке (если не используется стиль LBS_SORT);
- LB_DELETESTRING- для удаления строки с некоторым порядковым номером;
- LB_RESETCONTENT- для полного очищения списка;
- LB_GETCOUNT - для определения общего количества пунктов списка;
- LB_GETTEXTLENGTH - для определения длины любого пункта списка;
- LB_SETCURSEL -для установки элемента, выбираемого по умолчания (для списков с единичной выборкой);
- LB_SELECTSTRING -для выборки (установки) элемента списка на основе его первых символов (для списков с единичной выборкой);
- LB_GETCURSEL -для определения индекса элемента, выбранного в текущий момент (для списков с единичной выборкой);
- LB_SETSEL -для установки состояния выбора конкретного элемента, при этом не оказывая влияния на другие элементы, которые могли бы быть выбранными(для списков с множественным выбором);
- LB_GETSEL - для определения, выбран ли конкретный элемент списка или нет.
Добавление строки в список:
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)L"Text1");
Параметры:
wParam = 0;
lParam = (LPARAM)(LPCSTR)lpszStr;
lpszStr - указатель на добавляемую строку.
Возвращаемое значение:
Номер строки в списке (первая строка имеет номер 0), или код ошибки
Пример вывода выбранного элемента:
// Определяем номер выделенной строки uSelectedItem = (int)SendMessage(hListBox, LB_GETCURSEL, 0, 0L); if(uSelectedItem != LB_ERR) { // Получаем выделенную строку SendMessage(hListBox, LB_GETTEXT, uSelectedItem, (LPARAM)Buffer); // Выводим ее на экран MessageBox(hwnd, (LPSTR)Buffer, szWindowTitle, MB_OK); }Самым мощным сообщение для окон списка является сообщение LB_DIR. Следующий оператор заполняет список перечнем файлов каталога, иногда с подкаталогами и именами доступных дисков:
SendMessage(hWndList,LB_DIR, iAttr,(LPARAM)szFileSpec);
- Параметр iAttr– это код атрибута файла, он определяет атрибуты отображаемых в списке файлов.
- Параметр szFileSpec – это указатель на строку, задающую спецификацию файлов. Такая спецификация не влияет на подкаталоги, которые содержатся в списке.
Рассмотрим, какие значения, объединенные порязрядным ИЛИ, можно использовать для задания атрибутов файлов:
- В качестве младшего байта используется обычный атрибут файла: DDL_READWRITE – обычный файл; DDL_READONLY – файл только для чтения, DDL_HIDDEN – скрытый файл; DDL_SYSTEM – системный файл; DDL_DIRECTORY – подкаталог; DDL_ARCHIVE – файл с установленным архивным битом.
- Старший байт обеспечивает некоторый дополнительный контроль над выводимыми именами: DDL_DRIVES – включение имен дисков; DDL_EXCLUSIVE – включать только файлы с указаными атрибутам.
Вот как будет, например, выглядеть вызов, выводящий в список имена всех файлов текущего каталога, имена всех подкаталогов этого каталога (в виде [subdir]) и имена всех доступных дисков (в виде [-A-]):
SendMessage(hWndList,LB_DIR,
DDL_READWRITE|DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_DIRECTORY|DDL_DRIVES|DDL_ARCHIVE,
(LPARAM)"*.*");
- Если для списка не используется стиль LBS_SORT, то имена файлов и каталогов выводятся вперемешку, а имена доступных дисков оказываются в конце списка.
Замечание.Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Если окно списка имеет фокус ввода, то для выбора пунктов можно пользоваться как мышью, так и клавиатурой.