- •Тема: Работа с элементами управления в Windows-программах
- •Кнопки различных стилей (класс button)
- •Радио-переключатели
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Cписки разных стилей (класс listbox)
- •Выпадающие списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Тема: Работа с таймерами в Windows
- •Создание элементов управления визуально
- •Задания
- •1. Создать оконное приложение, которое спрашивает имя и выводит текст: «Введенное_имя? Не, не знаю такого»
Cписки разных стилей (класс listbox)
С помощью класса “listbox” можно создавать одноколоночные и многоколоночные списки, имеющие вертикальную (для одноколоночных списков) и горизонтальную (для многоколоночных списков) полосу просмотра.
Список может быть как с одиночным выбором, так и с множественным. Последний позволяет пользователю выбирать более одного пункта списка
Пример
hListBox = CreateWindow("listbox", NULL,
WS_CHILD | WS_VISIBLE | LBS_STANDARD |
LBS_WANTKEYBOARDINPUT,
30, 30, 200, 100,
hwnd, (HMENU) ID_LIST, hInst, NULL);
Окно списка посылает сообщение WM_COMMAND своему родительскому окну, когда в списке выбирается какой-либо пункт. Родительское окно может определить, какой пункт списка выбран.
Замечание. При необходимости родительское окно может создать список, внешний вид которого определяется пользователем, и само отрисовывать изображения элементов списка.
Рассмотрим стили окон списков
При задаваемом по умолчанию стиле окна списка (только стиль WS_CHILD) сообщения WM_COMMAND родительскому окну не посылаются. Это означает, что программе следует опрашивать окно списка посредством передачи ему сообщений относительно выбранных в списке пунктов.
В окна списка почти всегда включают идентификатор стиля LBS_NOTIFY, что позволяет родительскому окну получать от окна списка сообщение WM_COMMAND.
Если приложение желает иметь возможность сортировать элементы списка, ему необходимо использовать в окне списке и другой часто используемый идентификатор стиля – LBS_SORT.
По умолчанию, в списке допускается выбор только одного пункта. Если необходимо создать список с возможностью выборки сразу нескольких пунктов, то следует использовать стиль LBS_MULTIPLESEL.
По умолчанию, оконная процедура окна списка выводит только список элементов без какой-либо рамки вокруг. Рамку можно добавить с помощью стиля WS_BORDER.
Для прокрутки содержимого с помощью мыши и вертикальной полосы прокрутки следует использовать стиль WS_VSCROLL.
В заголовочных файлах Windows определяется стиль списка, который называется LBS_STANDARD. Стиль LBS_STANDARD включает в себя наиболее часто используемые стили списка. Он определяется как комбинация
(LBS_NOTIFY|LBS_SORT|WS_VSCROLL|WS_BORDER)
Замечание. Также можно пользоваться стилями WS_SIZEBOX и WS_CAPTION, которые дают возможность менять размер окна и перемещать его по рабочей области родительского окна.
Рассмотрим сообщения, которые могут посылать родительские окна окнам списков для их заполнения и дальнейшей работы с ними
После создания окна списка в него следует добавить строки текста – элементы списка. Это делается при помощи функции SendMessage посредством отправки сообщений окну списка. Ссылка на строку текста (на элемент) обычно осуществляется через индекс, который начинается с 0, что соответствует самому верхнему элементу списка.
Специфических сообщений, которые родительское окно может послать окну списка при помощи функции SendMessage, достаточно много. Рассмотрим наиболее часто употребляемые:
LB_ADDSTRING - для добавления строки в конец списка или по алфавитному порядку (последнее - если используется стиль LBS_SORT);
LB_INSERTSTRING - для вставки строки на определенное порядковое место в списке (если не используется стиль LBS_SORT);
LB_DELETESTRING - для удаления строки с некоторым порядковым номером;
LB_RESETCONTENT - для полного очищения списка;
LB_GETCOUNT - для определения общего количества пунктов списка;
LB_GETTEXTLENGTH - для определения длины любого пункта списка;
LB_SETCURSEL - для установки элемента, выбираемого по умолчания (для списков с единичной выборкой);
LB_SELECTSTRING - для выборки (установки) элемента списка на основе его первых символов (для списков с единичной выборкой);
LB_GETCURSEL - для определения индекса элемента, выбранного в текущий момент (для списков с единичной выборкой);
LB_SETSEL - для установки состояния выбора конкретного элемента, при этом не оказывая влияния на другие элементы, которые могли бы быть выбранными(для списков с множественным выбором);
LB_GETSEL - для определения, выбран ли конкретный элемент списка или нет.
Добавление строки в список:
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)L"Text1");
Параметры:
wParam = 0;
lParam = (LPARAM)(LPCSTR)lpszStr;
lpszStr - указатель на добавляемую строку.
Возвращаемое значение:
Номер строки в списке (первая строка имеет номер 0), или код ошибки
Пример вывода выбранного элемента:
// Определяем номер выделенной строки
uSelectedItem = (int)SendMessage(hListBox,
LB_GETCURSEL, 0, 0L);
if(uSelectedItem != LB_ERR)
{
// Получаем выделенную строку
SendMessage(hListBox, LB_GETTEXT,
uSelectedItem, (LPARAM)Buffer);
// Выводим ее на экран
MessageBox(hwnd, (LPSTR)Buffer, szWindowTitle,
MB_OK);
}
Самым мощным сообщение для окон списка является сообщение LB_DIR. Следующий оператор заполняет список перечнем файлов каталога, иногда с подкаталогами и именами доступных дисков:
SendMessage(hWndList,LB_DIR, iAttr,(LPARAM)szFileSpec);
Параметр iAttr – это код атрибута файла, он определяет атрибуты отображаемых в списке файлов.
Параметр szFileSpec – это указатель на строку, задающую спецификацию файлов. Такая спецификация не влияет на подкаталоги, которые содержатся в списке.
Рассмотрим, какие значения, объединенные порязрядным ИЛИ, можно использовать для задания атрибутов файлов:
В качестве младшего байта используется обычный атрибут файла: DDL_READWRITE – обычный файл; DDL_READONLY – файл только для чтения, DDL_HIDDEN – скрытый файл; DDL_SYSTEM – системный файл; DDL_DIRECTORY – подкаталог; DDL_ARCHIVE – файл с установленным архивным битом.
Старший байт обеспечивает некоторый дополнительный контроль над выводимыми именами: DDL_DRIVES – включение имен дисков; DDL_EXCLUSIVE – включать только файлы с указаными атрибутам.
Вот как будет, например, выглядеть вызов, выводящий в список имена всех файлов текущего каталога, имена всех подкаталогов этого каталога (в виде [subdir]) и имена всех доступных дисков (в виде [-A-]):
SendMessage(hWndList,LB_DIR,
DDL_READWRITE|DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_DIRECTORY|DDL_DRIVES|DDL_ARCHIVE,
(LPARAM)"*.*");
Если для списка не используется стиль LBS_SORT, то имена файлов и каталогов выводятся вперемешку, а имена доступных дисков оказываются в конце списка.
Замечание. Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Если окно списка имеет фокус ввода, то для выбора пунктов можно пользоваться как мышью, так и клавиатурой.
Рассмотрим сообщения, которые могут посылать списки родительским окнам
Окно списка посылает родительскому окну сообщения WM_COMMAND, в старшем слове параметра wParam этого сообщения содержится код уведомления:
LBN_ERRSPACE - превышен размер памяти, отведенный для списка
LBN_SELCHANGE - изменен текущий выбор (подсветка перемещается по списку);
LBN_DBLCLK - на пункте списка имел место двойной щелчок мышью.
Замечание. Окно списка посылает коды уведомления LBN_SELCHANGE и LBN_DBLCLK только в том случае, если в стиль дочернего окна включен идентификатор LBS_NOTIFY.
Для обработки сообщения от списка оконная функция родительского окна может содержать код следующего вида:
case WM_COMMAND:
{ UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна
UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочер. окна
If(idCtrl==ID_listbox&&code==LB_SELCHANGE)
{
// текущий выбор в списке изменился
. . .
}
}; return 0;
