В этой главе мы продолжим рассмотрение общих элементов управления. Будут рассмотрены спин (up-down control, spin, control), ползунок (track bar) и индикатор (progress bar).
Работа со спином
Во многих ситуациях Вы, несомненно, найдете удобным использование нового элемента управления, называемого спином (up-down control, spin control). Спин представляет собой не что иное, как особый вид линейки прокрутки (scroll bar). Он состоит из кнопок со стрелками, которые помещаются на концах линейки прокрутки, и не имеет полосы прокрутки, которая в линейках находится между этими кнопками. Если Вы уже работали с различными приложениями Windows, то, вероятно, заметили, что некоторые линейки прокрутки настолько малы, что полоса прокрутки для них просто не нужна. Достаточно только кнопок типа «вверх» и «вниз». Именно для подобных случаев разработчики Windows предусмотрели такой элемент управления, как спин. Как Вы вскоре увидите, работа со спином очень похожа на работу с линейкой прокрутки.
Существует два варианта использования спина:
1) он применяется как отдельная маленькая линейка прокрутки;
2) он может работать в сочетании с другим элементом управления, называемым в этом случае приятельским окном (buddy window).
В качестве приятельского окна чаще всего используется окно редактирования (edit box). Именно в этом случае в английском языке применяются термины «spin control» или «spinner window», во всех других случаях используется термин «up-down control». Практически все действия по управлению спином выполняются автоматически: это делает его очень простым и удобным элементом. Ниже приведены два примера работы со спином. В первом из них спин работает как небольшая линейка прокрутки, а во втором используется в сочетании с окном редактирования.
Создание спина. Для создания спина используется функция CreateUpDownControl():
HWND CreateUpDownControl(DWORD Style, int X, int Y,
int Width, int Height,
HWND hParent, int ID,
HINSTANCE hInst,
HWND hBuddy, int Max,
int Min, int StarPos);
Здесь параметр Styleопределяет стиль окна спина и должен содержать стандартные значения стилей WS_CHILD, WS_VISIBLE и WS_BORDER. Он также может включать стили, представленные в приведенной ниже таблице 11.1.
Таблица 11.1
Стили «up-down control»
№ | Стиль | Эффект |
UDS_ALIGNLEFT | Спин размещается слева от приятельского окна | |
UDS_ALIGNRIGHT | Спин размещается справа от приятельского окна | |
UDS_ARROWKEYS | Разрешается использование клавиш со стрелками для изменения текущего значения спина | |
UDS_AUTOBUDDY | Определяется окно | |
UDS_HORZ | Создается горизонтальный спин (по умолчанию он располагается вертикально) | |
UDS_NOTHOUSANDS | Запрещается отображение запятой (для разделения триад) в больших числах (только для спинов с окнами редактирования) | |
UDS_SETBUDDYINT | Автоматически изменяется текст в приятельском окне при изменении позиции спина. Это позволяет автоматически отображать позицию спина в приятельском окне | |
UDS_WRAP | «Переворот» позиции спина при достижении граничного значения |
Положение левого верхнего угла спина задается параметрами X и Y,а его ширина и высота – параметрами Widthи Height. Дескриптор родительского окна спина передается в параметре hParent. Идентификатор спина задается параметром ID. Параметр hInstзадает дескриптор активного приложения. Дескриптор приятельского (buddy) окна передается в параметре hBuddy. Если приятельское окно отсутствует, значение этого параметра должно быть NULL.
Минимальное и максимальное значения позиций спина задаются параметрами Minи Мах.Если значение Махменьше значения Min,спин прокручивается в обратную сторону. Значение начальной позиции спина (оно должно быть в пределах заданного диапазона) определяется параметром StarPos.
Функция CreateUpDownControl возвращает дескриптор элемента управления.
Сообщения спина. При нажатии какой-либо стрелки спина он посылает родительскому окну сообщение WM_VSCROLL.Дескриптор спина при этом передается в параметре lParam.Поскольку одновременно может существовать несколько элементов управления, посылающих сообщение WM_VSCROLL,дескриптор, передаваемый в lParam,позволяет установить, сообщение какого из этих элементов Вы обрабатываете в данный момент. Чтобы определить новую позицию спина, нужно, используя функцию SendMessage(),направить ему сообщение UDM_GETPOS.В этом случае функция возвратит значение текущего положения спина.
Кроме UDM_GETPOSспин может принимать и обрабатывать другие сообщения; наиболее часто используемые из них приведены в таблице 11.2. Например, используя сообщение UDM_SETPOS,можно установить текущую позицию спина.
Таблица 11.2