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

8.6 Класс окна списка

Последними из предопределенных в Windows дочерних окон управления, о которых будет рассказано в этой главе, являются окна списков (list box). Список — это набор текстовых строк, который выводится на экран в виде прокручиваемого в прямоугольнике столбца текста. Программа может добавлять или удалять строки в списке путем посылки сообщений оконной процедуре списка. Окно списка посылает сообщения WM_COMMAND своему родительскому окну, когда в списке выбирается какой-либо пункт. Родительское окно может определить, какой пункт списка был выбран.

Чаще всего списки используются в окнах диалога, например, когда окно диалога вызывается при выборе опции Open в меню File. В окне списка отображаются имена файлов текущего каталога, а также другие подкаталоги. Список может быть как с одиночным выбором, так и с множественным. Последний позволяет пользователю выбирать более одного пункта списка. Если окно списка имеет фокус ввода, то один из пунктов списка выводится окруженным штриховой линией. Такая индикация не означает, что данный пункт списка выбран. Выбранный пункт индицируется световым выделением, что означает вывод его в инверсном виде.

В списке с единичным выбором пользователь может выбрать пункт списка, на котором находится курсор, путем нажатия клавиши <Spacebar>. Клавиши управления курсором перемещают как курсор, так и текущую выборку, и с помощью них можно прокручивать содержимое списка. Клавиши <Page Up> и <Page Down> также позволяют прокручивать список, при этом перемещается не выборка, а только курсор. Нажатие буквенной клавиши приводит к перемещению курсора и выборки к первому (или следующему) пункту, который начинается с этой буквы. Пункт списка также можно выбрать путем щелчка или двойного щелчка мыши.

В списке со множественным выбором клавиша <Spacebar> переключает состояние выборки того пункта, на котором находится курсор. (Если пункт уже был выбран, то выборка отменяется.) Клавиши управления курсором отменяют выборку всех ранее выбранных пунктов и перемещают курсор и выборку точно также, как в случае списка с единичной выборкой. Однако клавиша <Ctrl> совместно с клавишами управления курсором позволяет перемещать курсор без перемещения выборки. Клавиша <Shift> совместно с клавишами управления курсором позволяет расширять выборку.

Щелчок и двойной щелчок мыши на элементе списка с множественной выборкой отменяют все ранее выбранные пункты и выбирают тот пункт списка, на котором был щелчок. Однако щелчок мыши при нажатой клавише <Shift> добавляет в выборку указанный пункт без изменения состояния выборки других пунктов.

8.6.1 Стили окна списка

Дочернее окно списка вы создаете с помощью вызова функции CreateWindow, используя имя "listbox" в качестве имени класса окна и WS_CHILD в качестве идентификатора стиля. Однако при этом задаваемом по умолчанию стиле сообщения WM_COMMAND родительскому окну не посылаются. Это означает, что программе следует опрашивать окно списка (посредством сообщений к нему) относительно выбранных в списке пунктов. Поэтому окно списка почти всегда включает идентификатор стиля окна LBS_NOTIFY, что позволяет родительскому окну получать от окна списка сообщения WM_COMMAND. Если вы хотите получить возможность сортировки элементов списка, вам необходимо использовать в окне списка и другой часто используемый идентификатор стиля — LBS_SORT.

По умолчанию, в списке допускается выбор только одного пункта. Если вы хотите создать список с возможностью выборки сразу нескольких пунктов, вам необходимо использовать идентификатор стиля LBS_MULTIPLESEL.

Обычно, если к списку добавляется новый элемент, то окно списка обновляется. Вы можете предотвратить это, если включите стиль LBS_NOREDRAW. Скорее всего вы не захотите использовать этот стиль. Вы можете временно запретить перерисовку окна списка, используя сообщение WM_SETREDRAW, о котором будет рассказано чуть позже.

По умолчанию, оконная процедура окна списка выводит на экран только список элементов без какой-либо рамки вокруг него. Рамку окна вы можете добавить с помощью идентификатора стиля окна WS_BORDER. Для прокрутки содержимого списка с помощью мыши и вертикальной полосы прокрутки используйте идентификатор стиля окна WS_VSCROLL.

В заголовочных файлах Windows определяется стиль окна списка, который называется LBS_STANDART и включает в себя наиболее часто употребляемые стили. Он определяется следующим образом:

(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)

Вы также можете пользоваться идентификаторами WS_SIZEBOX и WS_CAPTION, которые дают возможность менять размер окна списка и перемещать его по рабочей области родительского окна.

Ширина окна списка должна подбираться с учетом ширины самой длинной строки списка плюс ширина полосы прокрутки. Ширину вертикальной полосы прокрутки можно получить с помощью вызова функции:

GetSystemMetrics(SM_CXVSCROLL);

Высоту окна списка можно рассчитать путем перемножения высоты символа на число пунктов, которые вы одновременно хотите видеть в окне. В окне списка при размещении строк текста величина межстрочного пространства не используется.

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