Операционная система Windows 95 для программиста© Александр Фролов, Григорий ФроловТом 22, М.: Диалог-МИФИ, 1993, 271 стр. 7.1. Орган управления TrackbarВнешний вид органа управления Trackbar показан на рис. 7.1.
Рис. 7.1. Орган управления Trackbar По принципу действия и назначению Trackbar напоминает орган управления Scrollbar (полоса просмотра), который мы подробно рассмотрели в 12 томе "Библиотеки системного программиста". В окне Trackbar имеется движок, который можно перемещать мышью, клавишами перемещения курсора, а также клавишами <Home>, <End>, <PgUp> и <PgDn>. При перемещении движка родительское окно, создавшее орган управления Trackbar, получает извещения. Помимо движка, в окне органа управления Trackbar есть риски (tick marks), разделяющие движок на равные части. Кроме того, можно выделить любой диапазон в окне Trackbar. Вы можете выбрать горизонтальное или вертикальное расположение органа управления Trackbar. Риски могут находиться с любой стороны, с обеих сторон или их может не быть совсем. При создании Trackbar приложение должно определить диапазон значений, соответствующих положению движка, шаг расположения рисок, а также шаг изменения этих значений. Создание органа управления TrackbarДля создания органа управления Trackbar можно
воспользоваться функцией CreateWindowEx , указав ей
предопределенный класс окна TRACKBAR_CLASS . При этом
следует использовать следующие стили,
определяющие расположение и внешний вид органа
управления Trackbar:
Не забудьте также инициализировать библиотеку стандартных органов управления, вызвав функцию InitCommonControls : InitCommonControls(); Чаще всего, однако, орган управления Trackbar создается не функцией CreateWindowEx, а редактором диалоговых панелей. Именно так мы и поступили в приложении Compact Disk Player, просто переместив изображение Trackbar из палитры органов управления в диалоговую панель. Если для работы вы используете систему Microsoft Visual C++ версии 2.0 , предназначенную для Microsoft Windows NT, то вам потребуется отредактировать регистрационную базу данных (иначе в указанной палитре не будет новых органов управления). Процесс редактирования несложен и описан в SDK. Прежде всего вам нужно запустить приложение REGEDIT , что можно сделать, например, с помощью всемогущей кнопки Start. На экране появится содержимое регистрационной базы данных в виде дерева просмотра (рис. 7.2).
Рис. 7.2. Просмотр содержимого регистрационной базы данных Теперь вам нужно раскрыть ветвь этого дерева, которая ведет к набору параметров редактора диалогов. Эта ветвь обозначается как HKEY_CURRENT_USER\Software\Microsoft\Visual C++ 2.0 Dialog Editor. Далее из меню Edit выберите строки New и Binary Value. Задайте имя для нового элемента данных как ChicagoControls. После этого из меню Edit выберите строку Modify и введите значение 01 00 00 00. Результат показан на рис. 7.3.
Рис. 7.3. Внесенные изменения в регистрационную базу данных, позволяющие использовать новые органы управления в системе разработки Microsoft Visual C++ версии 2.0 Завершите работу редактора регистрационной базы данных. Теперь после перезапуска Microsoft Visual C++ в соответствующей палитре вам будут доступны новые органы управления. После перемещения изображения органа управления Trackbar в проектируемую диалоговую панель вы можете сделать по этому изображению двойной щелчок левой клавишей мыши и определить стили в блокноте Trackbar Properties (рис. 7.4).
Рис. 7.4. Определение стилей органа управления Trackbar Обработка извещенийКогда пользователь перемещает движок органа управления Trackbar, родительское окно получает извещения в форме сообщения WM_HSCROLL (или WM_VSCROLL для горизонтального расположения). Эти извещения аналогичны извещениям, поступающим от полосы просмотра Scrollbar. Младшее слово параметра wParam сообщения WM_HSCROLL
может содержать один из следующих кодов
извещения:
Ниже мы привели функцию DlgProc_OnHScroll из приложения Compact Disk Player, обрабатывающую извещения от органа управления Trackbar: void DlgProc_OnHScroll(HWND hdlg, HWND hwndCtl, UINT code, int pos) { switch(code) { case TB_LINEDOWN: case TB_PAGEDOWN: CdPlayNext(hdlg); break; case TB_LINEUP: case TB_PAGEUP: CdPlayPrev(hdlg); break; case TB_BOTTOM: CdPlay(hdlg, nTrackCnt); break; case TB_TOP: CdPlay(hdlg, 1); break; case TB_THUMBPOSITION: CdPlay(hdlg, pos); break; default: break; } } Как видите, здесь все очень просто. Функции DlgProc_OnHScroll передаются преобразованные параметры сообщения WM_HSCROLL. Код извещения находится в параметре code, а новое значение позиции (которое нужно для обработки извещения TB_THUMBPOSITION) - в параметре pos. Сообщения для органа управления TrackbarНиже мы перечислили сообщения, которые
приложение может посылать органу управления
Trackbar при помощи функции SendMessage :
Детальное описание параметров этих сообщений вы найдете в SDK. Из-за недостатка места мы подробно рассмотрим только самые важные из них. Прежде всего, если оран управления Trackbar расположен в диалоговой панели, вы должны определить его идентификатор. Это можно сделать с помощью функции GetDlgItem (описанной в 12 томе "Библиотеки системного программиста"): hTrackBar = GetDlgItem(hdlg, IDC_TRACKBAR); В этом примере в переменную hTrackBar записывается идентификатор окна органа управления Trackbar, который определен в диалоговой панели с идентификатором IDC_TRACKBAR (рис. 7.4). При инициализации органа управления Trackbar вы должны определить диапазон изменения значений, т. е. минимальную и максимальную позицию движка в окне Trackbar. Это можно сделать с помощью сообщения TBM_SETRANGE : SendMessage(hTrackBar, TBM_SETRANGE, TRUE, MAKELPARAM(1, nTrackCnt)); Через параметр wParam вместе с этим сообщением передается флаг перерисовки. Если он равен TRUE, сразу после установки диапазона окно органа управления будет перерисовано, если FALSE - нет. Значение MAKELPARAM(min, max), записанное в lParam, определяет минимальное min и максимальное max значения позиции движка. Затем нужно установить расстояние, на которое перемещается движок при управлении им с помощью мыши и клавиатуры. Для этого окну органа управления Trackbar нужно послать сообщения TBM_SETPAGESIZE и TBM_SETLINESIZE , например: SendMessage(hTrackBar, TBM_SETPAGESIZE, 0, 1); SendMessage(hTrackBar, TBM_SETLINESIZE, 0, 1); Для этих сообщений параметр wParam должен быть равен нулю. В параметр lParam следует записать значение шага. В данном случае мы устанавливаем одинаковый шаг, однако вы можете использовать и разные шаги. Например, для грубого позиционирования вы можете указать в сообщении TBM_SETPAGESIZE шаг, равный 10, а для тонкого - указать в сообщении TBM_SETLINESIZE шаг, равный 1. Для принудительной установки движка Trackbar в новую позицию используйте сообщение TBM_SETPOS : SendMessage(hTrackBar, TBM_SETPOS, TRUE, nCurTrack); Параметр wParam этого сообщения содержит флаг позиционирования. Если он равен TRUE (как в приведенном выше примере), движок устанавливается в позицию, указанную параметром lParam. Если же этот флаг равен FALSE, движок не перемещается. Заметьте, что есть одно отличие между полосой просмотра Scrollbar и органом управления Trackbar. Когда пользователь делает щелчок мышью по полосе просмотра, приложение должно в ответ на это установить новое положение движка с помощью функции SetScrollPos . В противоположность этому, в указанной ситуации орган управления Trackbar перемещает движок автоматически. |