Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
02_Кнопки_текстовые поля.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
257 Кб
Скачать
☆

Выпадающие списки (класс 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;