- •Процедурное программирование
- •Регистрация класса окна
- •Создание окна
- •Командная строка приложения
- •Функции окна приложения
- •Сообщение wm_destroy
- •Вывод в рабочую область окна
- •Контекст устройства и область отрисовки.
- •Сообщение wm_paint
- •Окно-список
- •Заполнение окна-списка
- •Список файлов
- •Изменение цвета органов управления
- •Комбинированный список
- •Меню и назначение клавиш
- •Создание описания меню в файле ресурсов
- •Сообщения меню
- •Диалоговые окна ( диалоги )
- •Определение диалоговых окон в файле ресурсов
- •Диалоговое окно About
- •Функция диалогового окна
- •Взаимодействие с органами управления диалоговых окон
- •Окно сообщений
- •Ввод данных
- •Извлечение данных из диалога
- •Ввод - вывод данных посредством передачи сообщений
- •Функция CreateFile ( )
- •Функция WriteFile ( )
- •Отображение файла в память
- •Функция CreateFileMapping().
- •Функция MapViewOfFile()
- •Работа с отображенным файлом
- •И н т е р ф е й с графических устройств (gdi)
- •Контекст устройства
- •Получение индекса контекста устройства
- •Получение информации из контекста устройства
- •Атрибуты контекста устройства
- •Сохранение изменений в контексте устройства
- •Система координат в Windows
- •Режимы отображения
- •Системы координат
- •Режим mm_text
- •Метрические режимы
- •Режим mm_isotropic
- •Режим mm_anisotropic
- •Вывод графических объектов
- •Двумерные объекты
- •Сегмент и сектор эллипса
- •Библиографический список
Заполнение окна-списка
Отобразив окно-список на экране, его надо заполнить текстовыми строками. Для этого надо передать сообщение окну-списку с помощью описанной ранее функции 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 является дальним указателем на буфер, в который копируется строка.
Внутренние сообщения окна-списка
Окно-список может получить фокус ввода двумя путями.
Пользователь нажимает кнопку мыши, когда указатель мыши находится внутри окна-списка.
Родительское окно само передает окну-списку фокус ввода, вызывая функцию SetFocus:
SetFocus (hListWnd);
Когда фокус ввода принадлежит окну-списку, пользователь может применять для выбора элемента списка, кроме мыши, также и клавиши перемещения курсора, пробел и символьные клавиши.
Окно-список передает сообщение WM_COMMAND в родительское окно. Параметры сообщения представлены в следующей таблице:
Параметры Описание
wParam Идентификатор дочернего окна
LOWORD (lParam) Индекс дочернего окна
HIWORD (lParam) Код сообщения