Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Операционная система 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:

Стиль Описание
TBS_HORZ Горизонтальное расположение окна Trackbar
TBS_VERT Вертикальное расположение окна Trackbar
TBS_TOP Риски будут расположены сверху (используется вместе со стилем TBS_HORZ)
TBS_BOTTOM Риски будут расположены снизу (используется вместе со стилем TBS_HORZ)
TBS_LEFT Риски будут расположены слева (используется вместе со стилем TBS_VERT)
TBS_RIGHT Риски будут расположены справа (используется вместе со стилем TBS_VERT)
TBS_BOTH Риски будут расположены с обеих сторон
TBS_AUTOTICKS Если указан этот стиль, риски создаются для каждого возможного значения из диапазона значений, определенных для Trackbar
TBS_NOTICKS Сразу после создания окна Trackbar риски не отображаются, однако позже вы их сможете определить при помощи сообщений TBM_SETTIC и TBM_SETTICFREQ, которые будут рассмотрены ниже
TBS_ENABLESELRANGE Возможно выделение диапазона значений

Не забудьте также инициализировать библиотеку стандартных органов управления, вызвав функцию 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 может содержать один из следующих кодов извещения:

Код извещения Описание
TB_PAGEUP Извещение поступает, когда пользователь сделал щелчок мышью по полосе Trackbar слева или сверху от движка, либо нажал клавишу с кодом VK_PRIOR (клавишу <PgUp>)
TB_PAGEDOWN Пользователь сделал щелчок справа или снизу от движка, либо нажал клавишу с кодом VK_NEXT (клавишу <PgDn>)
TB_LINEUP Была нажата клавиша с кодом VK_LEFT или VK_UP (клавиша перемещения курсора влево или вверх)
TB_LINEDOWN Была нажата клавиша с кодом VK_RIGHT или VK_DOWN (клавиша перемещения курсора вправо или вниз)
TB_TOP Пользователь нажал клавишу с кодом VK_HOME (клавишу <Home>)
TB_BOTTOM Пользователь нажал клавишу с кодом VK_END (клавишу <End>)
TB_THUMBPOSITION Это извещение приходит, когда пользователь переместил мышью движок в новое положение
TB_THUMBTRACK Извещение TB_THUMBTRACK приходит в процессе перемещения движка
TB_ENDTRACK Извещение приходит после завершения перемещения движка мышью или отпускания клавиши, с помощью которой перемещался движок

Ниже мы привели функцию 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 :

Сообщение Описание
TBM_CLEARSEL Отмена выделения диапазона значений в окне Trackbar
TBM_CLEARTICS Удаление рисок
TBM_GETCHANNELRECT Определение координат и размеров воображаемого прямоугольника, ограничивающего область перемещения движка
TBM_GETLINESIZE Определение величины (в рисках) на которую перемещается движок, если пользователь нажимает клавиши с кодами VK_LEFT, VK_RIGHT, VK_UP или VK_DOWN
TBM_GETNUMTICS Определение количества рисок в окне Trackbar
TBM_GETPAGESIZE Определение величины (в рисках) на которую перемещается движок, если пользователь нажимает клавиши с кодами VK_PRIOR или VK_NEXT
TBM_GETPOS Определение текущего положения движка
TBM_GETPTICS Функция SendMessage, посылающая это сообщение, возвращает указатель на массив позиций рисок
TBM_GETRANGEMAX Определение максимальной позиции движка
TBM_GETRANGEMIN Определение минимальной позиции движка
TBM_GETSELEND Определение конечной позиции выделенной области
TBM_GETSELSTART Определение начальной позиции выделенной области
TBM_GETTHUMBLENGTH Определение длины движка в пикселах
TBM_GETTHUMBRECT Определение расположения и размеров движка
TBM_GETTIC Определение позиции риски с заданным номером
TBM_GETTICPOS Определение физического расположения указанной риски в системе координат внутренней области окна
TBM_SETLINESIZE Установка величины (в рисках) на которую перемещается движок, если пользователь нажимает клавиши с кодами VK_LEFT, VK_RIGHT, VK_UP или VK_DOWN
TBM_SETPAGESIZE Установка величины (в рисках) на которую перемещается движок, если пользователь нажимает клавиши с кодами VK_PRIOR или VK_NEXT
TBM_SETPOS Установка текущего положения движка
TBM_SETRANGE Установка минимальной и максимальной позиции движка в окне Trackbar
TBM_SETRANGEMAX Установка максимальной позиции движка в окне Trackbar
TBM_SETRANGEMIN Установка минимальной позиции движка в окне Trackbar
TBM_SETSEL Установка начальной и конечной позиции выделенной области
TBM_SETSELEND Установка конечной позиции выделенной области
TBM_SETSELSTART Установка начальной позиции выделенной области
TBM_SETTHUMBLENGTH Установка длины движка в пикселах
TBM_SETTIC Установка позиции риски с заданным номером. Не используется для первой и последней риски, которые создаются автоматически
TBM_SETTICFREQ Установка интервала, с которым располагаются риски

Детальное описание параметров этих сообщений вы найдете в 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 перемещает движок автоматически.

[Назад] [Содеожание] [Дальше]