- •Тема: Работа с элементами управления в Windows-программах
- •Кнопки различных стилей (класс button)
- •Радио-переключатели
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Cписки разных стилей (класс listbox)
- •Выпадающие списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Тема: Работа с таймерами в Windows
- •Создание элементов управления визуально
- •Задания
- •1. Создать оконное приложение, которое спрашивает имя и выводит текст: «Введенное_имя? Не, не знаю такого»
Выпадающие списки (класс combobox)
Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного списка используются стили, коды извещения и сообщения, аналогичные списку ”listbox”, а также некоторые сообщения, специфические для редактора текста класса “edit”.
базовые стили комбинированного списка
Среди всех стилей комбинированного списка можно выделить три базовых:
Стиль CBS_SIMPLE соответствует списку с окном редактирования (или, как его называют, окном выбора).
Если список имеет стиль CBS_DROPDOWN, в исходном состоянии он состоит из окна редактирования и расположенной справа пиктограммы со стрелкой (кнопкой, предназначенной для отображения списка). Если нажать на эту пиктограмму левой клавишей мыши, под окном редактирования появится список.
Стиль CBS_DROPDOWNLIST аналогичен стилю CBS_DROPDOWN, но окно редактирования можно использовать только для просмотра выделенной строки, а не для редактирования или ввода.
Рассмотрим сообщения от комбинированного списка, посылаемые родительскому окну
Комбинированные списки посылают оконной процедуре родительского окна сообщения WM_COMMAND. Значения параметров сообщения wParam и lParam такие же как и для кнопок. Коды извещения для комбинированного списка имеют символические имена с префиксом CBN_.
Для обработки сообщения от комбинированного списка оконная функция родительского окна может содержать код следующего вида:
case WM_COMMAND:
{ UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна
UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочер. окна
If(idCtrl==ID_combo&&code==CBN_SELCHANGE)
{
// сделан выбор в комбинированном списке
. . .
}
}; return 0;
Рассмотрим сообщения, посылаемые родительским окном комбинированным спискам
Для управления списком “combobox” используется набор сообщений, аналогичный набору сообщений для списка “listbox” и редактора текста “edit”. Функция SendMessage, посылающая сообщения списку, возвращает значение, которое зависит от выполняемой функции, или коды ошибок.
В файле windows.h определены сообщения, специально предназначенные для работы со списком “combobox”. Символические имена этих сообщений имеют префикс CB_.
Полосы прокрутки (класс scrollbar)
В отличие от других дочерних окон управления, посылающих родительскому окну сообщения, полосы прокрутки не посылают сообщения WM_COMMAND. Вместо этого они, также как и полосы прокрутки окна, посылают ему сообщения WM_VSCROLL и WM_HSCROLL.
При обработке сообщений полос прокрутки приложению с помощью параметра lParam может различать сообщения полос прокрутки окна и полос прокрутки – элементов управления. Для полос прокрутки окна lParam равен NULL, а для полос – элементов управления он является дескриптором этих полос прокрутки, другими словами дескриптором дочернего окна
Значения же старшего и младшего слов параметра wParam для полос прокрутки окна и для полос прокрутки – дочерних окон имеют одинаковый смысл.
Замечание. Полосы прокрутки – элементы управления можно сделать любого размера. Для того чтобы создать элементы управления с теми же стандартными размерами, что и полосы прокрутки окна, можно использовать функцию GetSystemMetrics:
вызов GetSystemMetrics(SM_CYHSCROLL) выдает высоту горизонтальной полосы прокрутки,
а вызов GetSystemMetrics(SM_CXVSCROLL) – ширину вертикальной полосы прокрутки.
Для полос прокрутки – элементов управления также можно установить диапазон и текущее положение с помощью тех же вызовов функция, что и для полос прокрутки окна:
SetScrollRange(hWndScroll,SB_CTL,iNewMin,iNewMax,bRedraw);
Полосы прокрутки – элементы управления могут обрабатывать сообщения клавиатуры, но только в том случае, если они имеют фокус ввода. Если необходимо, чтобы полоса прокрутки управления получала фокус ввода, когда на полосе прокрутки происходит щелчок мыши, то следует включить идентификатор WS_TABSTOP в параметр стиля дочернего окна управления при вызове функции CreateWindow.
Приведем пример обработки сообщений от полосы прокрутки – дочернего окна управления. Пусть в окне hWnd создано дочернее окно управления hWndScroll – вертикальная линейка прокрутки, и для нее установлены диапазон и текущее положение бегунка:
static int min_sb=1,max_sb=100,pos_sb=20;
SetScrollRange(hWndScroll,SB_CTL,min_sb,max_sb,TRUE);
SetScrollPos(hWndScroll,SB_CTL,pos_sb,TRUE);
Рассмотрим фрагмент оконной функции, демонстрирующий возможную обработку действий пользователя с этой вертикальной линейкой прокрутки:
case WM_VSCROLL:
{
// произведенное действие
int nScrollCode=(int)LOWORD(wParam);
// текущая позиция
short int nPos=(short int)HIWORD(wParam);
// дескриптор полосы просмотра или NULL
HWND hwndScrollBar=(HWND)lParam;
int old_pos_sb=pos_sb;
switch(nScrollCode)
{
case SB_PAGEDOWN: pos_sb+=10; break;
case SB_PAGEUP: pos_sb-=10; break;
case SB_LINEDOWN: pos_sb+=1; break;
case SB_LINEUP: pos_sb-=1; break;
case SB_THUMBPOSITION: pos_sb=nPos; break;
case SB_THUMBTRACK: pos_sb=nPos; break;
default: return 0l;
}
if(pos_sb<min_sb) pos_sb=min_sb;
if(pos_sb>max_sb) pos_sb=max_sb;
if(old_pos_sb!=pos_sb)
SetScrollPos(hWndScroll,SB_CTL,pos_sb,TRUE);
}; return 0l;
