Clubrus - это адаптация Инета под простого российского пользователя!

Реклама в Интернет & Все кулички
Добро пожаловать !
Добавить в избранное






Подпись: Multimedia Builder: статьи, вопросы и ответы, образцы проектов, обмен опытом, форум

 

Урок 7. Растягивание окна проекта мышью

Автор: PolN, действительный член клуба любителей ММВ

Сначала создадим скрипт и назовём его ResizeX, он будет отвечать за растягивание нашего окна по горизонтали. Запускать его будет горячая область RightHot. Но для этого надо зайти в её свойства и написать там несколько строк. На вкладке Mouse up напишем всего одну строчку:

MouseUp=TRUE

А на вкладке Mouse down напишем:

MouseUp=FALSE
ScriptTimer("TimerA=ResizeX","20")

Из скрипта видно, что он запускает скрипт ResizeX, значит, к нему и обратимся.

Итак, для изменения размеров окна в ММВ существует команда SysCommand("ResizeWindow","x,y"). Её-то мы и будем использовать.
Напишем в этом скрипте:

MX=MouseX()
** для ограничения минимального значения окна далее напишем
If (MX<400) Then
   MX=400
End
** ну а теперь главную команду:
SysCommand("ResizeWindow","MX+5,0")

Размер по ширине равен не просто МХ, а МХ+5; это сделано для того, что бы при растягивании окна мышь была не сбоку от окна, а чуть чуть заходила на это окно. В общем, сделано это для красоты. Далее в скрипте, в некоторых командах, будет встречаться поправка на эти пять пикселей, и я надеюсь, что заострять внимание на этом больше не понадобится.

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

ScriptTimer("ResizeX","50")

Теперь можно проверить работу нашего проекта. Нажимаем клавишу F5, подводим мышу к правому краю окна и нажимаем левую кнопку. Начинаем водить ей из стороны в сторону и видим, что размер окна стал изменяться. Теперь отпустим кнопку мыши и видим, что ничего не произошло, окно так и продолжает изменять размер вслед за указателем. Также вы заметили, что окно увеличивается, а объекты на нем остались неподвижными. Что же, давайте начнём устранять эти недоработки.

Нам нужно переместить объект RightHeightKorn в правый верхний угол изменённого окна. Возникает резонный вопрос – как это сделать? Да очень просто. Мы знаем, чему равна ширина окна – МХ+5. Значит, нужно из ширины окна отнять ширину объекта RightHeightKorn. Полученная координата и будет координатой Х этого объекта. А координата Y будет равна 0. Итак, в скрипте напишем:

MoveObject("RightHeightKorn","MX+5-ObjectWidth(RightHeightKorn),0")

Только не забудьте, что команда ScriptTimer("ResizeX","50") всегда должна оставаться самой последней. Можно проверить, что у нас получилось, и - о чудо! - угол стал двигаться так, как ему положено.

Теперь напишем команду для передвижения объекта Right. Возникает вопрос - чему равна Y координата этого объекта. Неужели придётся подбирать её экспериментально? Нет, для того чтобы узнать Y-координату объекта, в ММВ есть команда ObjectY(Имя объекта). Её-то мы и используем для обозначения Y координаты. Вот пример команды:

MoveObject("Right","MX+5-ObjectWidth(Right),ObjectY(Right)")

По этому же принципу напишем команду для объекта RightDownKorn:

MoveObject("RightDownKorn","MX+5-ObjectWidth(RightDownKorn),ObjectY(RightDownKorn)")

Теперь можно снова проверить работу проекта. Ну как, уже лучше? Однако верхняя и нижняя стороны не изменяют своих размеров. И это не проблема. Мы используем ещё одно свойство команды MoveObject. Эта команда может не только перемещать объекты, а ещё и изменять их размеры. Записывается эта команда так:

MoveObject(“Объект”,”X,Y,Ширина,Высота”)

В данном случае нам не придётся менять координаты X и Y, а также не придётся менять высоту этих объектов, изменяться будет только ширина. И равна она будет почти ширине окна т.е. просто MX.

Для объекта Height пропишем:

MoveObject("Height","ObjectX(Height),ObjectY(Height),MX,ObjectHeight(Height)")

А для объекта Down напишем:

MoveObject("Down","ObjectX(Down),ObjectY(Down),MX,ObjectHeight(Down)")

Из этих скриптов видно, что мы меняем только ширину объектов, все остальные параметры являются константами.

Снова проверяем работу проекта. Ну что, еще лучше?

Займемся написанием сценария для передвижения "часов". Фон и текстовый объект CBK_Time24 я объединил в группу Time. Эту группу мы и будем двигать. Координата левого края этой группы по оси Х равна 320. А начальная ширина окна равна 400. Значит, значение новой координаты будет равно разнице ширины(MX+5) окна и разнице начальных координат(400-320=80). Группу Time мы будем передвигать на координату MX+5-80. Так и запишем:

MoveObject("Time","MX+5-80,ObjectY(Time)")

Кнопки управления тоже нужно передвигать во время изменения размеров окна. Эти кнопки я объединил и назвал группу PlayButton. По моей задумке кнопки будут всегда находиться посередине окна. Попробуем вычислить координату Х этой группы. Итак, известна ширину окна (МХ+5), также мы можем узнать ширину группы PlayButton: (ObjectWidth(PlayButton)). Теперь из ширины окна вычтем ширину группы PlayButton и всё это поделим на два. Это и будет новой координатой группы PlayButton.

MoveObject("PlayButton","(MX+5-ObjectWidth(PlayButton))/2,ObjectY(PlayButton)")

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

Теперь вставим на нужное место центральную часть слайдера и растянем её в стороны. Так, как нам нужно. После этого на края установим левую и правую части и всё подровняем. Далее подумаем, что будет происходить при растягивании нашего слайдера. Во-первых, будет расширяться центральная часть, а во-вторых - перемещаться правая. Начальная длина центральной части примерно 325 пикселей, а начальная ширина окна 400 пикселей. 400-325=75. Значит, ширина центральной части слайдера всегда будет меньше ширины окна на 75 пикселей, т.е. МХ+5-75 или МХ-70. Так и напишем в сценарии:

MoveObject("SldrCenter","ObjectX(SldrCenter),ObjectY(SldrCenter),MX-70,ObjectHeight(SldrCenter)")

И ещё нам надо переместить правую часть слайдера. Начальная координата Х слайдера равна 350, а ширина окна 400. 400-350=50. Т.е. координата Х будет равна MX+5-50 или МХ-45:

MoveObject("SldrRight","MX-45,ObjectY(SldrRight)")

Проверьте, что теперь получилось. Уже виден кое-какой результат. Однако при отпускании мыши окно не останавливается и продолжает бегать за указателем. Это мы сейчас легко исправим.

После последней команды, но перед строкой ScriptTimer("ResizeX","50") запишем так называемый скрипт отбоя, который будет оценивать состояние мыши и при отпускании кнопки этот скрипт остановит работу всего скрипта.

Приведу целиком пример, а ниже объясню как он работает.

MState=MouseLButton()
If (MState=0) Then
   MouseUp=FALSE
   Return()
End

Итак, переменной MState (можете назвать её как угодно) мы присваиваем значение MouseLButton() это константа, которая при нажатой левой кнопке мыши равна единице, а при отпущенной кнопке равно 0. Далее идёт условие, которое проверяет состояние, и если кнопка мыши отпущена, то выполняются команды MouseUp=FALSE и Return() и скрипт останавливается, а если кнопка нажата, то, соответственно, эти команды не выполняются и скрипт продолжает работать.

Проверим теперь работу нашего проекта. Нажали кнопку и потащили окно, после отпускания окно остановилось и не двигается вслед за указателем, что нам и нужно. Однако, если снова попробовать ухватить край окна и потащить его, то ничего не произойдет, а почему?!! Да потому, что мы забыли переместить горячие области на новые координаты! Они ведь остались совсем в другом месте... Это мы сейчас быстренько исправим. Запишем перед командой MState=MouseLButton() три строчки:

MoveObject("RightHot","MX,ObjectY(RightHot)")
MoveObject("RightDownHot","MX,ObjectY(RightDownHot)")
MoveObject("DownHot","0,ObjectY(DownHot),MX,ObjectHeight(DownHot)")

Здесь уже всё должно быть понятно и ничего объяснять не надо. Вот теперь проверяем проект и видим, что мы можем растягивать его в ширину, и всё работает как положено. Что и требовалось. Далее я приведу пример целого скрипта, для проверки.

MX=MouseX()
If (MX<400) Then
   MX=400
End
SysCommand("ResizeWindow","MX+5,0")
MoveObject("RightHeightKorn","MX+5-ObjectWidth(RightHeightKorn),0")
MoveObject("Right","MX+5-ObjectWidth(Right),ObjectY(Right)")
MoveObject("RightDownKorn","MX+5-ObjectWidth(RightDownKorn),ObjectY(RightDownKorn)")
MoveObject("Height","ObjectX(Height),ObjectY(Height),MX,ObjectHeight(Height)")
MoveObject("Down","ObjectX(Down),ObjectY(Down),MX,ObjectHeight(Down)")
MoveObject("Time","MX+5-80,ObjectY(Time)")
MoveObject("PlayButton","(MX+5-ObjectWidth(PlayButton))/2,ObjectY(PlayButton)")
MoveObject("SldrCenter","ObjectX(SldrCenter),ObjectY(SldrCenter),MX-70,ObjectHeight(SldrCenter)")
MoveObject("SldrRight","MX-45,ObjectY(SldrRight)")
MoveObject("RightHot","MX,ObjectY(RightHot)")
MoveObject("RightDownHot","MX,ObjectY(RightDownHot)")
MoveObject("DownHot","0,ObjectY(DownHot),MX,ObjectHeight(DownHot)")
MState=MouseLButton()
If (MState=0) Then
   MouseUp=FALSE
   Return()
End
ScriptTimer("ResizeX","50")

Если вы думаете, что на этом можно закончить, то вы глубоко заблуждаетесь. Ведь мы написали скрипт только для изменения размеров окна по ширине, а нам надо ещё изменять размер по высоте. Я не буду приводить столь подробного описания, как для первого скрипта, а лишь слегка его объясню. Зайдем в свойства горячей области DownHot и на вкладке Mouse up запишем MouseUp=TRUE, а на вкладке Mouse down:

MouseUp=FALSE
ScriptTimer("TimerB=ResizeY","20")

Теперь создадим скрипт ResizeY и в нём запишем следующее:

MY=MouseY()
If (MY<300) Then
   MY=300
End
SysCommand("ResizeWindow","0,MY+5")
MoveObject("Down","ObjectX(Down),MY+5-ObjectHeight(Down)")
MoveObject("LeftDownKorn","ObjectX(LeftDownKorn),MY+5-ObjectHeight(LeftDownKorn)")
MoveObject("RightDownKorn","ObjectX(RightDownKorn),MY+5-ObjectHeight(RightDownKorn)")
MoveObject("Left","ObjectX(Left),ObjectY(Left),ObjectWidth(Left),MY")
MoveObject("Right","ObjectX(Right),ObjectY(Right),ObjectWidth(Right),MY")
MoveObject("Volume","ObjectX(Volume),MY+5-31")
MoveObject("Time","ObjectX(Time),MY+5-35")
MoveObject("PlayButton","ObjectX(PlayButton),MY+5-54")
MoveObject("TrackSldr","ObjectX(TrackSldr),MY+5-73")
MoveObject("RightHot","ObjectX(RightHot),ObjectY(RightHot),10,MY+5")
MoveObject("DownHot","0,MY")
MoveObject("RightDownHot","ObjectX(RightDownHot),MY")
MState=MouseLButton()
If (MState=0) Then
   MouseUp=FALSE
   Return()
End
ScriptTimer("ResizeY","50")

Этот скрипт пишется аналогично первому. Есть только одно различие. В командах для объектов Left и Right мы изменяем четвертый параметр, т.е. высоту.

Дело осталось за малым. Зайдем в свойства горячей области RightDownHot и на вкладке Mouse up запишем MouseUp=TRUE, а на вкладке Mouse down:

MouseUp=FALSE
ScriptTimer("TimerC=ResizeXY","20")

Теперь создадим скрипт ResizeXY и в нём запишем следующее:

RunScript("ResizeX")
RunScript("ResizeY")
MState=MouseLButton()
If (MState=0) Then
   MouseUp=FALSE
   Return()
End
ScriptTimer("ResizeXY","50")

Всё, теперь наше окно можно растягивать влево, вправо и по диагонали. На основе описанного выше примера вы сможете растягивать окна любых ваших проектов, проявив, конечно, достаточно смекалки и терпения :)))

Ну, а описанный на нашем уроке проект можно скачать (размер 12 Кб) непосредственно с сайта и разобрать его в ММВ для более детального изучения.


Написать отзыв

Назад 

 

 

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

 





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



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