Линейки прокрутки, переключатели, окна пометки, окна списка.

Кнопки, переключатели, полосы просмотра, редакторы текста и др. относятся к органам управления. Они создаются как дочерние окна на базе предопределенных классов.

1. Кнопки, переключатели (переключатели – кнопки с 3-мя состояниями (вкл, выкл и неактивен)

Для создания кнопки нужно создать дочернее окно на базе предопределенного класса "button". После этого родительское окно будет получать от кнопки сообщение с кодом WM_COMMAND. Этим сообщением кнопка информирует родительское окно о том, что с ней что - то сделали, например, нажали.

А) Создание кнопки:

HWND CreateWindow (LPCSTR lpszClassName, LPCSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu, HINSTANCE hinst, void FAR* lpvParam);

1 параметр – имя класса "button".

2 параметр – надпись на кнопке – указатель на строку

3 параметр – набор битов – стиль окна, обязательно WS_CHILD

4 и 5 параметры – координаты кнопки относительно левого верхнего угла родительского окна

6 и 7 параметры – ширина и высота кнопки

8 параметр – идентификатор родительского окна; 9 параметр – идентификатор самой кнопки

10 параметр – идентификатор приложения

11 параметр – дальний указатель на область данных, для кнопки – 0.

Б) Стили:

BS_3STATE – переключатель может нах. в 3 состояниях: вкл, выкл и неактив.

BS_AUTO3STATE – внешний вид изменяется автоматически

BS_AUTORADIOBUTTON – в виде окружности, 2 состояния, изм-ся автоматически

BS_DEFPUSHBUTTON – стандартная кнопка с жирной рамкой

BS_GROUPBOX – Прямоугольная область, внутри которой могут находиться другие кнопки. Обычно используется в диалоговых панелях. Этот орган управления не воспринимает сообщения от мыши или клавиатуры.

В) Способы управления:

А) Вызов специальных функций, например MoveWindow (новое расположение и размеры), EnableWindow (разрешение или запрет поступления сообщений), ShowWindow (показать или скрыть - SW_HIDE и SW_SHOWNORMAL). SetWindowText (новый текст на кнопке)

Б) Отправка сообщения, в ответ на которые кнопка будет менять вид (2 способа – функции PostMessage и SendMessage – через очередь приложения и минуя ее).

Для перерисовки посылается сообщение BM_SETCHECK: SendMessage(hButton, BM_SETCHECK, 1, 0L);

Переключатели в поле wParam передают 0 – выкл, 1- вкл или 2 – неактив. сост-е. Параметр lParam сообщения BM_SETCHECK должен быть равен 0.

Узнать состояние – посылать сообщение BM_GETCHECK:

WORD nState;

nState = (WORD) SendMessage(hButton, BM_GETCHECK, 0, 0L);

Окна пометки: окна на базе класса “button” (кнопки) со стилем BS_CHECKBOX.

2. Полосы прокрутки.

Полосы просмотра (Scrollbar) широко используются в приложениях Windows для просмотра текста или изображения, которое не помещается в окне. «Scrollbar» - класс, на основе которого реализуется полоса просмотра. Бывает вертикальной и горизонтальной и посылает в родительское окно WM_HSCROLL и WM_VSCROLL. Перемещение дискретно (интервал задается при инициализации). Бывает 2 типа позиционирования: точное – нажатием на кнопки побокам от полосы и грубое – кликами выше или ниже ползунка на полосе прокрутки.

А) Создание

HWND hScroll = CreateWindow("scrollbar", NULL, WS_CHILD | WS_VISIBLE | SBS_HORZ, 20, 400, 100, 50, hWnd, IDC_SCROLLBAR, hInstance, NULL);1 – класс, на базе которого создается полоса просмотра; 2 – заголовок окна, должен быть NULL 3 – флаги полосы; 4-7 – расположение, размеры; 8 – идентификатор окна; 9 – идентификатор полосы просмотра (Определяет не саму полосу, а прямоугольник для полосы).

Б) Стили ( флаги SBS только для полос просмотра):

SBS_BOTTOMALIGN – Создается горизонтальная полоса просмотра, высота которой равна высоте системной полосы просмотра. Выполняется выравнивание нижнего края полосы просмотра по нижнему краю прямоугольника, координаты и размер которого определен при вызове функции CreateWindow. Этот стиль должен использоваться вместе со стилем SBS_HORZ.

SBS_HORZ (SBS_VERT)– Создается горизонтальная (вертикальная) полоса просмотра. Размер и расположение полосы просмотра определяются при вызове функции CreateWindow

SBS_LEFTALIGN – аналогично 1, по левому краю.

SBS_SIZEBOX – орган управления с небольшим прямоугольником серого цвета (Size Box). Если вы установите курсор мыши внутрь органа управления, нажмете левую клавишу мыши и будете перемещать мышь, родительское окно будет получать сообщения, аналогичные сообщениям от рамки, предназначенной для изменения размера окна.

В) Коды полос:

SB_LEFT (SB_RIGHT), SB_TOP(SB_BOTTOM) – влево(вправо) для горизонтальных, вверх(вниз) - для вертикальных

SB_ENDSCROLL – отпускаете мышь при работе с полосой

Г) Сообщения от полос:

WM_HSCROLL и WM_VSCROLL содержат в wParam коды:

SB_LEFT, SB_RIGHT – сдвиг до упора влево и врпаво

SB_LINEUP, SB_LINELEFT,SB_LINERIGHT,SB_LINEDOWN – сдвиг на одну позицию.

SB_PAGELEFT, SB_PAGEUP (и так далее) – сдвиг на одну страницу

SB_ENDSCROOL – окончание работы мышью

Д) Необходима инициализация:

Указываем диапазон изменений значений ползунка:

void WINAPI SetScrollRange(HWND hwnd, int fnBar, int nMin, int nMax, BOOL fRedraw);

2 параметр – тип полосы просмотра: SB_CTL – как орган упр. или SB_HORZ и SB_VERT.

1 параметр – если SB_CTL – ID органа управления, иначе ID Окна, в котором создается полоса.

3 и 4 параметры – дальние указатели на целые диапазона (Диапоазон не больше 32767)

5 – нужна ли перерисовка.

Е) Управление:

int WINAPI SetScrollPos(HWND hwnd, int fuBar, int nPos, BOOL fRepaint);

3 параметр – положение ползунка. ShowScrollBar– показать или скрыть полосу прокрутки

Окна списка

Предназначены для выбора элемента из некоторого определенного списка. С помощью класса "listbox" можно создавать одноколоночные и многоколоночные списки, имеющие вертикальную (для одноколоночных списков) и горизонтальную (для многоколоночных списков) полосу просмотра.

А) Создание:

hListBox = CreateWindow("listbox", NULL,WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_WANTKEYBOARDINPUT, 30,30,200,100, hwnd, (HMENU) ID_LIST, hInst, NULL);

2 – имя/заголовок (должен быть NULL)

8 – идентификатор родит окна, куда будет поступать сообщение WM_COMMAND

Б) Стили окон списка:

LBS_EXTENDEDSEL – Можно выделять несколько рядом расположенных строк

LBS_MULTICOLUMN – для мультиколоночного списка

LBS_MULTIPLESEL – выделять несколько любых строк

LBS_SORT – строки списка будут отсортированы и другие (LBS_NOINTEGRALHEIGHT, LBS_NOREDROW, LBS_OWNERDRAWFIXED)

Список посылает в родительское окно сообщение WM_COMMAND. wParam этого сообщения содержит идентификатор списка, Младшее слово параметра lParam содержит идентификатор окна списка, а старшее - код извещения.

LBN_DBLCLK – Двойной щелчок левой клавишей мыши по строке списка

LBN_KILLFOCUS – потерян фокус ввода

LBN_SELCHANGE – польз-ль выбрал другую строку.

В) Сообщения для списка:

Для управления списком приложение посылает ему сообщения, вызывая функцию SendMessage.

LB_ADDSTRING – добавление строки в список LB_DELETESTRING

LB_DIR – заполнение списка именами файлов и каталогов в текущем каталоге

LB_FINDSTRING – поиск строки в списке.

Наши рекомендации