Отобразив окно-список на экране, его надо заполнить текстовыми строками. Для этого надо передать сообщение окну-списку с помощью описанной ранее функции SendMessage. Элемент окна-списка определяется своим индексом. Индекс принимает значение от нуля до числа элементов в списке. Пусть переменная hListWnd определяет окно-список, а wIndex - индекс элемента окна-списка.
Если используется окно-список с автоматической сортировкой, то заранее не известно, какую позицию займет новый элемент. При этом для пассивного добавления элемента списка можно использовать сообщение LB_ADDSTRING:
SendMessage (hListWnd, LB_ADDSTRING, 0, (LONG) szString);
Параметр lParam передаваемого сообщения содержит дальний указатель на строку, добавляемую к списку.
Отметим, что если в списке сортировка отключена, то сообщение LB_INSERTSTRING, которому указывается индекс нового элемента wIndex:
SendMessage (hListWnd, LB_INSERTSTRING, wIndex, (LONG) szString);
При этом все элементы, расположенные ниже вставляемого элемента, смещаются вниз на одну позицию.
Можно очистить все окно-список, передав ему сообщение LB_RESETCONTENT:
SendMessage (hListWnd, LB_RESETCONTENT, 0, 0L);
Элемент с индексом wIndex можно также удалить из окна-списка, передав окну сообщение LB_DELETESTRING:
SendMessage (hListWnd, LB_DELETESTRING, wIndex, 0L);
Когда вы добавляете или удаляете строки в окне-списке, он автоматически перерисовывается на экране с новым содержимым. Если удаляется или добавляется много строк окна-списка, то при помощи сообщения LB_SETREDRAW на некоторое время можно запретить обновление окна-списка:
// запрещаем обновление окна
SendMessage (hListWnd, LB_SETREDRAW, FALSE, 0L);
// изменение содержимого окна-списка
// разрешаем обновление окна
SendMessage (hListWnd, LB_SETREDRAW, TRUE, 0L);
Заметим, что при работе с окном-списком функция SendMessage возвращает одну из следующих величин: LB_ERRSPACE (не достаточно памяти для размещения нового элемента в списке), LB_ERR (при всех остальных ошибок) или LB_OKAY (операция закончилась успешно).
После того, как вы заполнили окно-список, можно определить число элементов, содержащихся в нем:
nCount = (WORD) SendMessage (hListWnd, LB_GETCOUNT, 0,0L);
Приложение может также выделить элемент списка, основываясь на первых символах строки. В следующем вызове функции SendMessage параметр wIndex определяет начальную позицию в окне-списке, начиная с которой будет производиться поиск строки, первые несколько символов которой заданы в строке szSearchString:
wIndex = (WORD) SendMessage (hListWnd, LB_SELECTSTRING, wIndex, (LONG) szSearchString);
Если заданный своими первыми символами элемент обнаружен в списке, то функция SendMessage возвращает индекс найденного элемента. Если искомый элемент не обнаружен, то возвращается величина LB_ERR.
При получении сообщения WM_COMMAND можно определить, какой элемент списка выбран в данный момент:
nIndex = (WORD) SendMessage (hListWnd, LB_GETCURSEL, 0, 0L);
Если в данный момент нет выделенных элементов, то переменная nIndex равна LB_ERR.
Чтобы определить длину строки, заданной индексом элемента, передайте окну-списку сообщение LB_GETTEXTLEN:
nLength = (WORD) SendMessage (hListWnd, LB_GETTEXTLEN, nIndex, 0L);
Если вам надо скопировать строку из окна-списка в буфер, используйте сообщение LB_GETTEXT:
nLength = (WORD) SendMessage (hListWnd, LB_GETTEXT, nIndex, (LONG) szBuffer);
В обоих примерах приведенных выше, параметр nIndex определяет элемент окна-списка, а nLength длину строки, ему соответствующей. Во втором примере параметр szBuffer является дальним указателем на буфер, в который копируется строка.