Clubrus - это адаптация Инета под простого российского пользователя!
Stolica.ru
Реклама в Интернет & Все кулички
Добро пожаловать !
Добавить в избранное







 

Урок 3. Как сделать регулятор громкости

Надеюсь, что вы ждете этот материал, потому-что ваш мр3-плеер, сделанный на прошлом уроке, выглядит не совсем полноценным из-за отсутствия плавного движкового регулятора громкости. Вы могли бы и сами найти примеры по созданию такого регулятора, которые предусмотрительно создал для нас автор программы Roman Voska (это файл slider.mbd, находящийся в папке c:\Program Files\Multimedia Builder\Samples\). Если же разбираться в файле примера для вас оказалось делом непосильным, давайте попробуем разобраться с данным вопросом в этой статье.

Итак, для создания движкового регулятора (слайдера) нам потребуются четыре объекта: два объекта для управления поведением мыши (удобнее всего использовать в качестве этих объектов горячие области, но можно и прямоугольники), третий объект - это сам слайдер (движок регулятора), который должен перемещаться, когда его хватают и тащат мышью, и четвертый объект - скрипт, обеспечивающий, во-первых, перемещение слайдера в соответствии с положением курсора мыши, а во-вторых, изменение громкости в соответствии с положением слайдера. Условное расположение этих объектов показано на рисунке слева. Здесь присутствует еще пятый объект, отображающий уровень громкости в числовом виде, но о нем чуть позже.

Красным цветом на этом рисунке обозначены горячие области. Область HotSpotMouse посылает значение мыши mouseup = TRUE (т.е.истинное значение) в тот момент, когда мышь нажата, но еще не отпущена. А также запускает выполнение скрипта, управляющего громкостью. В этом-то скрипте как раз и используется для вычислений текущее положение курсора мыши. Когда мышь отпущена, посылается значение mouseup=FALSE (т.е. ложное), и скрипт перестает реагировать на положение курсора мыши, громкость и положение движка фиксируются на том уровне и месте, где была отпущена мышь. Другая горячая область,  HotSpotMouseUp,  которая должна находиться обязательно ниже первой, возвращает истинное значение мыши, когда мышь отпущена. Эта область должна быть чуть больших размеров, чем первая (см.рисунок). Как объясняет автор программы, назначение этой области в том, чтобы прервать выполнение скрипта, для которого установлено внутреннее зацикливание (действительно, скрипт же должен выполняться до тех пор, пока вы "елозите" движок туда-сюда и не отпускаете мышь). Практически же отсутствие объекта HotSpotMouseUp приводит как бы к "залипанию" мыши к движку.

В объекте HotSpotMouse также определяются числовые значения четырех величин, которые будут использованы для вычислений при работе скрипта. Чтобы легче было разобраться, что это за величины, я сделал для вас иллюстрацию (см.рисунок справа).

Значения posmin и posmax определяют соответственно минимальное и максимальное горизонтальное положение движка. Напомню, что все координаты в Windows принято отсчитывать от верхнего левого угла. Поэтому значения нужных нам величин по горизонтали следует измерять от левого края окна проекта до левого края объекта, представляющего собой движок. С целью того, чтобы не усложнять скрипт дополнительными вычислениями, разницу между значениями posmin и posmax следует выбрать равной ста (см.рисунок). Действительно, ведь  значение громкости изменяется в пределах  от нуля до ста, и если от текущей координаты движка по горизонтали вычесть значение posmin, то как раз и получится числовое значение громкости, которое надо установить.

Третье значение, которое необходимо определить - это ypos, оно определяет вертикальное положение движка и отсчитывается, как вы уже поняли, от верхнего края окна проекта до верхнего края объекта, представляющего собой движок.

И последнее значение, handleoff, указывает, на каком расстоянии от левого края движка следует произвести "захват" его мышью.

Теперь создайте новый проект и разместите в нем объекты согласно первому рисунку. Объект движка назовите Volume. Он может представлять собой обычный прямоугольник или круг, или группу прямоугольников или других объектов, или растровую картинку любого из стандартных форматов. Этот объект носит чисто эстетический характер, и никаких действий ему не назначается. Также придется нарисовать условную полоску, обозначающую как бы канавку, по которой движется слайдер (движок). Впрочем, если в качестве фона в вашем проекте используется растровая картинка, то можно эту канавку предусмотреть непосредственно в картинке, придав ей, например объем (глубину), что сделает регулятор более реалистичным. В любом случае эта область перемещения движка тоже не несет никаких функциональных действий. Другое дело, что ее длина должна быть рассчитана так, чтобы обеспечить перемещение слайдера точно от края и до края. Но это уже подбирается опытным путем.

Объектам HotSpotMouse и HotSpotMouseUp  действия, естественно, нужно назначить. Сначала откройте свойства объекта HotSpotMouse и в окне написания скрипта (сценария) на вкладке Mouse up напишите следующее:

mouseup = TRUE

а на вкладке Mouse Down:

handleoff = 5
posmin =10
posmax = 110
ypos = 4
mouseup=FALSE
ScriptTimer("TimerA=ChangeVolume","50" )

Здесь вам придется ввести конкретные значения рассмотренных выше четырех величин. Они будут зависеть от того, в каком месте вашего проекта расположен регулятор. Определив его окончательное местоположение, нужно воспользоваться направляющими линиями для более удобного измерения этих величин. Напомню, что направляющие линии можно "вытащить", щелкнув мышью по направляющим линейкам и, не отпуская мыши, протянуть до нужного места в окне проекта. Величина handleoff, зависит только от того, как бы вы хотели, чтобы происходил "захват" слайдера.  Строчка ScriptTimer("TimerA=ChangeVolume","50") запускает скрипт ChangeVolume, который мы создадим ниже. В принципе эта строка могла бы выглядеть и так: ScriptTimer("ChangeVolume","50"). Указание TimerA означает использование нами независимого таймера в обход стандартного таймера. Таких таймеров в программе предусмотрено три: TimerA, TimerВ и TimerС. (Насколько я понимаю, это дает, например, возможность, запускать один и тот же скрипт тремя различными таймерами в разное время. Если я не прав, прошу поправить. - Авт.).

Перейдем к скрипту HotSpotMouseUp.  В окне написания скрипта на вкладке Mouse up напишите:

mouseup = TRUE

а в окне взаимодействия с другими объектами назначьте действие RunScript при перемещении мыши по объекту, а в качестве объекта укажите  HotSpotMouseUp (см.рис.) Здесь надо сделать любопытное замечание. Мы привыкли, что команда RunScript имеет отношение только к запуску скрипта. А в данном случае в качестве объекта скрипта указан вовсе и не скрипт, а горячая область (а мог бы быть указан и какой-либо другой объект). Дело в том, что программа считает скриптом любой объект, в свойствах которого назначено выполнение скрипта. Поэтому указание выполнить скрипт в данном случае будет означать выполнение скрипта, прописанного в данном объекте. (Это вам может пригодиться в будущем).

А сейчас создайте в проекте новый объект - скрипт, назовите его ChangeVolume, и давайте попробуем разобраться, как действует сценарий, который вы назначите этому объекту:

x = (MOUSEX()-handleoff)
if (x<posmin) then
x = posmin
end
if (x>posmax) then
x=posmax
end
MoveObject("Volume","(x,ypos")
VolumeUp("(x-posmin)")
if (mouseup) then
Return()
end
Refresh()
VolLev=CBK_Volume
VolLev$ = CHAR(VolLev) + '%'
LoadText("vlevel","VolLev$")
ScriptTimer("TimerA=ChangeVolume","50")

Итак. Вначале вводится числовая переменная х, значение которой принимается равным текущей позиции курсора по горизонтали за вычетом значения handleoff, выбранного вами (первая строка сценария). В следующих шести строках определяется, что если значение х меньше минимальной или больше максимальной позиции, установленных нами выше, то это значение численно приравнивается соответственно к минимальной или максимальной позиции. Так как значение х будет ниже использовано в расчетах для установки громкости, то практически это означает, что если вы щелкнули мышью левее левого края полоски или правее правого, громкость будет установлена либо минимальной, либо максимальной. Ведь громкость не может быть меньше нуля или больше ста :)

Следующая строка сценария дает команду переместить объект Volume (т.е. наш движок) на позицию с координатами х и ypos. Вторая координата (по вертикали) остается всегда неизменной и была задана нами выше, а координата по горизонтали определяется в первой строке сценария.

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

В конце сценария он зацикливается командой ScriptTimer, но перед этим есть еще три строчки, на которые я хочу обратить ваше внимание. Назначение этих строк в скрипте - вывод информации об уровне громкости. Да, но ведь можно было бы просто создать текстовый объект с меткой CBK_Volume, и он бы показывал числовое значение громкости. А эти три строки нужны только лишь для того, чтобы загружать информацию о громкости в другой текстовый объект с названием Vollev. Для чего? Это дает возможность добавить к числовой величине знак процентов. Мы с вами уже использовали такой синтаксис сценария для вывода информации о номере трека в плейлисте на предыдущем уроке, и поэтому разобраться в этом месте скрипта нам не представляет труда. Итак, значение числовой переменной Vollev приравнивается к величине CBK_Volume. Вводится строковая переменная Vollev$, значение которой состоит уже из значения числовой переменной Vollev и знака процентов.  Затем дается команда загрузить текст  из переменной Vollev$ в объект vlevel (так надо назвать текстовый объект - создайте его). И - чуть не забыл! - в проекте обязательно должен присутствовать объект CBK_Volume.

Вот что у меня получилось в итоге в моем учебном проекте (в конце статьи я дам вам возможность скачать все образцы). Проверьте, что получилось у вас. Если вы ничего не упустили и все сделали правильно, работоспособность регулятора гарантируется! :)  Однако, это еще не всё...

Дальше


 URL: http://clubrus.kulichki.net E-mail: Clubrus 





Новая версия этого сайта CLUBRUS.SU



Рейтинг ресурсов УралWeb Rambler's Top100