Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
392
Добавлен:
15.06.2014
Размер:
6 Мб
Скачать
☆

Комбинированные списки (класс combobox)

Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного списка используются стили, коды извещения и сообщения,

аналогичные списку ”listbox”, а также некоторые сообщения, специфические для редактора текста класса “edit”.

Для того чтобы создать список класса “combobox”, приложение должно вызвать функцию CreateWindow, передав ей в качестве первого параметра указатель на строку “combobox”. Второй параметр должен быть указан как NULL. Например:

static int ID_combo=5; static HWND hWndCombo;

. . .

hWndCombo=CreateWindow("combobox",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|

CBS_DROPDOWNLIST, x,y,width,height,hWnd,(HMENU)ID_combo,hInst,NULL);

•При создании списка “combobox” указываются специальные стили комбинированного списка, символические имена которых имеют префикс CBS_.

Базовые стили комбинированного списка

Среди всех стилей комбинированного списка можно выделить три базовых:

Стиль 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)

Существует два способа создания полос прокрутки в окне приложения.

Первый способ создания полос прокрутки основывается на том, что при создании

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

•Этот метод очень прост, но с его помощью можно создать только одну горизонтальную и одну вертикальную полосы прокрутки. Для того чтобы у окна появились эти полосы прокрутки, при создании окна в третьем параметре

функции CreateWindow необходимо указать стиль окна WS_VSCROLL или

WS_HSCROLL.

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

помощью функции CreateWindow. Для этого в первом параметре нужно указать класс окна “scrollbar”.

•Заголовок окна не используется, поэтому второй параметр функции должен быть указан как NULL. Третий параметр, определяющий стиль окна, наряду с константами WS_CHILD и WS_VISIBLE, должен содержать определение стиля полосы прокрутки – SBS_VERT или SBS_HORZ. Девятый параметр функции должен задавать идентификатор полосы прокрутки.

Для создания дочернего окна управления типа полоса прокрутки приложение должно вызвать функцию CreateWindow, передав ей в качестве первого параметра указатель на строку “scrollbar”, например:

static int ID_scroll=6; static HWND hWndScroll;

. . .

hWndScroll=CreateWindow("scrollbar",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| SBS_VERT|, x,y,width,height,hWnd,(HMENU)ID_scroll,hInst,NULL);

В отличие от других дочерних окон управления, посылающих родительскому окну сообщения, полосы прокрутки не посылают сообщения 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;