Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

8.6.4 Получение сообщений от окон списка

Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Родительское окно может предоставить управляющему (listbox control) окну списка фокус ввода с помощью вызова функции:

SetFocus(hwndList);

Если окно списка имеет фокус ввода, то для выбора пунктов списка также могут использоваться клавиши управления курсором, буквенные клавиши и клавиша <Spacebar>.

Управляющее окно списка посылает сообщения WM_COMMAND своему родительскому окну. Значение параметров сообщения lParam и wParam то же, что и для кнопок управления и управляющих окон редактирования:

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

HIWORD (wParam) Код уведомления

lParam Описатель дочернего окна

Ниже перечисляются коды уведомления и их значения:

LBN_ERRSPACE -2

LBN_SELCHANGE 1

LBN_DBLCLK 2

LBN_SELCANCEL 3

LBN_SELFOCUS 4

LBN_KILLFOCUS 5

Окно списка посылает своему родительскому окну коды LBN_SELCHANGE и LBN_DBLCLK только в том случае, если в стиль дочернего окна включен идентификатор LBS_NOTIFY.

Код LBN_ERRSPACE показывает, что превышен размер памяти, отведенный для списка. Код LBN_SELCHANGE показывает, что был изменен текущий выбор; эти сообщения имеют место, когда пользователь перемещает подсветку по списку, изменяет состояние выборки с помощью клавиши <Spacebar> или выбирает нужный элемент списка с помощью щелчка мыши. Код LBN_DBLCLK показывает, что на данном пункте списка имел место двойной щелчок мыши. (Значение кодов уведомления для LBN_SELCHANGE и LBN_DBLCLK соответствует количеству щелчков мыши.)

В зависимости от вашего приложения, вы можете использовать либо сообщения LBN_SELCHANGE, либо сообщения LBN_DBLCLK, либо оба вместе. Ваша программа будет получать много сообщений LBN_SELCHANGE, что же касается сообщений LBN_DBLCLK, то они будут случаться только при двойных щелчках мышью. Если в вашей программе используются двойные щелчки мышью, то вам понадобиться обеспечить соответствующий интерфейс клавиатуры для дублирования сообщений LBN_DBLCLK.

8.6.5 Простое приложение, использующее окно списка

Теперь, когда вы знаете как создать список, как заполнить его текстовыми элементами, как получать сообщения от окна списка и как извлекать строки, самое время создать приложение, использующее список. Программа ENVIRON использует окно списка в рабочей области окна для вывода имен текущих переменных окружения MS-DOS (таких, как PATH, COMSPEC и PROMPT). При выборе переменной, имя и строка окружения выводятся в верхней части рабочей области.

В программе ENVIRON создается два дочерних окна: окно списка стиля LBS_STANDART и статическое окно стиля SS_LEFT (текст с выравниванием по левому краю). В программе ENVIRON для получения списка строк окружения используется переменная environ (объявленная как внешняя в STDLIB.H). Программа использует сообщение LB_ADDSTRING для размещения каждой строки в окне списка.

Когда вы запускаете программу ENVIRON, то с помощью мыши или клавиатуры можете выбрать переменную окружения. Каждый раз, когда вы изменяете выбор, окно списка посылает своему родительскому окну сообщение WM_COMMAND, которое попадает в процедуру WndProc. Когда WndProc получает сообщение WM_COMMAND, она проверяет равно ли младшее слово параметра lParam (идентификатор дочернего окна) единице, и равно ли старшее слово параметра wParam (код уведомления) величине LBN_SELCHANGE. При наличии соответствующих значений она, с помощью сообщения LB_GETCURSEL, получает индекс выбранного элемента, а с помощью сообщения LB_GETTEXT — сам текст выбранного элемента, т. е. имя переменной окружения. Для получения строки, соответствующей этой переменной окружения, в программе ENVIRON используется функция языка С getenv, а функция SetWindowText используется для передачи этой строки статическому дочернему окну управления, в котором собственно и выводится на экран содержимое строки.

Обратите внимание, что в программе ENVIRON для индексирования переменной environ и получения строки нельзя использовать индекс, возвращаемый сообщением LB_GETCURSEL. Поскольку окно списка имеет стиль LBS_SORT (являющийся частью стиля LBS_STANDART), индексы не совпадают.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]