Линейки прокрутки, переключатели, окна пометки, окна списка.
Кнопки, переключатели, полосы просмотра, редакторы текста и др. относятся к органам управления. Они создаются как дочерние окна на базе предопределенных классов.
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 – поиск строки в списке.