Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции -Процедурное программирование в Windows.doc
Скачиваний:
13
Добавлен:
13.09.2019
Размер:
742.91 Кб
Скачать

Заполнение окна-списка

Отобразив окно-список на экране, его надо заполнить текстовыми строками. Для этого надо передать сообщение окну-списку с помощью описанной ранее функции 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 является дальним указателем на буфер, в который копируется строка.

Внутренние сообщения окна-списка

Окно-список может получить фокус ввода двумя путями.

  1. Пользователь нажимает кнопку мыши, когда указатель мыши находится внутри окна-списка.

  2. Родительское окно само передает окну-списку фокус ввода, вызывая функцию SetFocus:

SetFocus (hListWnd);

Когда фокус ввода принадлежит окну-списку, пользователь может применять для выбора элемента списка, кроме мыши, также и клавиши перемещения курсора, пробел и символьные клавиши.

Окно-список передает сообщение WM_COMMAND в родительское окно. Параметры сообщения представлены в следующей таблице:

Параметры Описание

wParam Идентификатор дочернего окна

LOWORD (lParam) Индекс дочернего окна

HIWORD (lParam) Код сообщения