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

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 25, М.: Диалог-МИФИ, 1993, 286 стр.

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

8.7. Регуляторы

Для регулировки каких-либо величин (цвета, громкости, яркости, размеров и т. п.) в приложениях Presentation Manager вы, конечно, можете использовать только что рассмотренную полосу просмотра. Однако есть более подходящее решение - создание регуляторов на базе предопределенного класса окна WC_CIRCULARSLIDER или WC_SLIDER .

Первый из этих классов позволяет легко создать регулятор круглой формы, напоминающий хорошо знакомые вам регуляторы в радиоаппаратуре. На базе класса WC_SLIDER можно создать линейный регулятор. В нашей книге мы рассмотрим только регулятор круглой формы (рис. 8.6), отложив описание линейного регулятора до одной из следующих книг, посвященных операционной системе IBM OS/2 Warp.

Рис. 8.6. Регулятор круглой формы

Круглый регулятор может иметь кнопки (со знаками + и -), предназначенные для изменения текущей позиции, а также риски. Основной орган, который используется для изменения текущей позиции круглого регулятора, это круглая ручка, на которой имеется одна большая риска или углубление круглой формы. Если пользователь делает щелчок левой клавишей мыши справа от риски, ручка поворачивается по часовой стрелке, если слева - против часовой стрелки. Еще один способ управления - поворачивание ручки при нажатой левой клавиши мыши, когда курсор мыши расположен на поверхности ручки.

Круглая ручка может иметь окно, в котором отображается значение текущей позиции, а также подпись. Все эти элементы показаны на рис. 8.5.

Создание круглого регулятора

Для создания круглого регулятора вы можете воспользоваться функцией WinCreateWindow, как это показано ниже:

hWndCirc1 = WinCreateWindow(hWnd,
  WC_CIRCULARSLIDER ,
  "Красный", WS_VISIBLE | CSS_NOTEXT, 0, 0, 0, 0,
  hWnd, HWND_TOP, CIRCSLD1_ID, NULL, NULL);

Здесь мы привели фрагмент обработчика сообщения WM_CREATE функции окна приложения Client Window, имеющего идентификатор hWnd. Размеры и расположение регулятора будут определены позже при обработке сообщения WM_SIZE. Как вы можете заметить, регулятор создается точно также, как и любой другой описанные нами ранее орган управления.

Внешний вид круглой ручки управления определяется стилем регулятора. Ниже приведены значения стилей, которые вы можете комбинировать при помощи логической операции ИЛИ:

Стиль Описание
CSS_360 С помощью этого стиля вы можете создать ручку управления, которая будет поворачиваться на 360 градусов. При этом будут автоматически установлены стили CSS_NONUMBER и CSS_NOBUTTON
CSS_CIRCULARVALUE Вместо риски на поверхности ручки будет создана круглая метка в виде небольшого углубления круглой формы
CSS_MIDPOINT Начальная и конечная риска на шкале регулятора будет иметь увеличенную длину
CSS_NOBUTTON Если указан этот стиль, в окне органа управления не будет кнопок + и -
CSS_NONUMBER Отмена отображения цифрового значения текущей позиции
CSS_NOTEXT Отмена отображения подписи под регулятором
CSS_POINTSELECT Если указан стиль CSS_POINTSELECT, изменяется способ управления регулятором при помощи мыши. Если установить курсор мыши в новую позицию и сделать щелчок левой клавишей мыши, регулятор скачкообразно изменит свою текущую позицию таким образом, что она будет совпадать с позицией курсора
CSS_PROPORTIONALTICKS Длина рисок на шкале регулятора будет вычисляться в процентах от радиуа регулятора. Этот способ удобен при работе видеоадаптера в режимах с низким разрешением

Установка параметров круглого регулятора

После создания круглого регулятора вы должны определить диапазон изменения значений позиции, установить начальную позицию, шаг изменения позиции и шаг размещения меток. Для выполнения всех этих операций необходимо послать окну регулятора соответствующие сообщения.

Диапазон изменения значений

Для установки диапазона изменения значений регулятору с помощью функции WinSendMsg посылается сообщение CSM_SETRANGE :

WinSendMsg(hWndCirc1, CSM_SETRANGE,
  MPFROMLONG(0L), MPFROMLONG(255L));

Через параметр mp1 этого сообщения передается начальное значение, а через параметр mp2 - конечное значение позиции. В приведенном выше примере при вращении ручки регулятора текущая позиция будет изменяться в диапазоне от 0 до 255.

Начальная позиция

Начальная позиция регулятора устанавливается при помощи сообщения CSM_SETVALUE . Ниже показан фрагмент кода, в котором начальная позиция устанавливается равной 255:

WinSendMsg(hWndCirc1, CSM_SETVALUE,
  MPFROMLONG(255L), NULL);

Как видно из этого примера, значение начальной позиции передается через параметр mp1. Параметр mp2 не используется и должен быть равен нулю.

Шаг изменения позиции и шаг размещения меток

Оба эти параметра устанавливаются одновременно при помощи сообщения CSM_SETINCREMENT :

WinSendMsg(hWndCirc1, CSM_SETINCREMENT,
  MPFROMLONG(10L), MPFROMLONG(2L));

Через параметр mp1 передается значение шага изменения позиции, а через параметр mp2 - значение шага размещения меток. Чем больше шаг изменения позиции, тем грубее регулировка.

Замена кнопок

При необходимости вы можете изменить внешний вид кнопок + и -, подготовив для них новые растровые изображения. Идентификаторы этих изображений необходимо передать вместе с сообщением CSM_SETBITMAPDATA . Подробное описание этого сообщения мы приведем в одной из следующих книг после того, как познакомим вас с графическим интерфейсом системы Presentation Manager и опишем способы работы с растровыми изображениями.

Определение параметров круглого регулятора

При необходимости приложение может определить текущие параметры регулятора, посылая его окну управляющие сообщения.

Текущее значение позиции

С помощью сообщения CSM_QUERYVALUE приложение может определить текущее значение позиции. Для этого через параметр mp1 вместе с этим сообщением необходимо передать указатель на переменную типа USHORT, в которую будет записано искомое значение.

Диапазон изменения значений

Посылая окну регулятора сообщение CSM_QUERYRANGE , приложение может определить диапазон изменения значений. Через параметр mp1 при этом необходимо передать указатель на переменную типа USHORT, в которую будет записано начальное значение позиции, а через параметр mp2 - указатель на переменную такого же типа для записи конечной позиции регулятора.

Радиус регулятора

Вы можете определить радиус регулятора, посылая его окну сообщение CSM_QUERYRADIUS . Через параметр mp1 при этом необходимо передать указатель на переменную типа USHORT, в которую будет записан радиус.

Шаг изменения позиции и шаг размещения меток

Для определения шага изменения позиции и шага размещения меток окну регулятора необходимо послать сообщение CSM_QUERYINCREMENT . Через параметры mp1 и mp2 необходимо передать указатели на переменные типа USHORT, в первую из которых будет записано значение шага изменения позиции, а во вторую - значение шага размещения меток.

Извещения от круглого регулятора

Когда пользователь выполняет какие-либо операции с регулятором, в родительское окно, создавшее этот орган управления, поступают извещающие сообщения с кодом WM_CONTROL . Обработчик этого сообщения должен выполнять установку значения параметра, который регулируется пользователем.

Младшее слово параметра mp1 сообщения WM_CONTROL содержит идентификатор регулятора. Если ваше приложение создает несколько регуляторов или других органов управления, посылающих извещения в виде сообщения WM_CONTROL, вы должны проверять этот параметр.

Через старшее слово параметра mp1 передается код извещения, который соответствует операции, выполняемой пользователем. Код извещения может принимать одно из следующих значений:

Код извещения Описание
CSN_SETFOCUS Регулятор получил или потерял фокус ввода. В первом случае через параметр mp2 передается значение TRUE, во втором - FALSE
CSN_CHANGED Пользователь изменил текущую позицию регулятора. Новое значение позиции передается через параметр mp2
CSN_TRACKING Ручка регулятора перемещается при помощи мыши. Промежуточные значения позиции передаются через параметр mp2

Помимо перечисленных выше, от круглого регулятора поступает извещение с кодом CSN_QUERYBACKGROUNDCOLOR . Это извещение можно использовать для изменения цвета фона регулятора.

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