Отсюда можно скачать полный текст документации в формате pdf
Отсюда можно скачать полный текст документации в формате pdf
Отсюда можно скачать полный текст документации в формате pdf
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Санкт-Петербургский государст<strong>в</strong>енный институт точной механики и<br />
оптики (технический уни<strong>в</strong>ерситет)<br />
Кафедра “Компьютерные технологии”<br />
К. А. Бондаренко, А. А. Шалыто<br />
Разработка XML - формата для описания<br />
<strong>в</strong>нешнего <strong>в</strong>ида <strong>в</strong>идеопроигры<strong>в</strong>ателя c<br />
использо<strong>в</strong>анием конечных а<strong>в</strong>томато<strong>в</strong><br />
Гипер<strong>текст</strong>о<strong>в</strong>ое программиро<strong>в</strong>ание с я<strong>в</strong>ным<br />
<strong>в</strong>ыделением состояний<br />
Проектная документация<br />
Проект создан <strong>в</strong> рамках<br />
“Д<strong>в</strong>ижения за открытую проектную документацию”<br />
http://is.ifmo.ru<br />
Санкт-Петербург<br />
2003
Содержание<br />
ВВЕДЕНИЕ...............................................................................................................................................3<br />
1. ПОСТАНОВКА ЗАДАЧИ.............................................................................................................5<br />
2. ПРИМЕР ГРАФА ПЕРЕХОДОВ.................................................................................................6<br />
3. ОПИСАНИЕ СИНТАКСИСА .....................................................................................................7<br />
4. ПРИМЕР ИСПОЛЬЗОВАНИЯ РАЗРАБОТАННОГО ФОРМАТА....................................16<br />
5. ЗАКЛЮЧЕНИЕ............................................................................................................................19<br />
ИСТОЧНИКИ ........................................................................................................................................20<br />
2
В<strong>в</strong>едение<br />
Для алгоритмизации и программиро<strong>в</strong>ания задач логического упра<strong>в</strong>ления<br />
была предложена SWITCH-технология, которая <strong>в</strong> дальнейшем была раз<strong>в</strong>ита для<br />
событийных и объектно-ориентиро<strong>в</strong>анных программ. Подробно ознакомиться с<br />
этой технологией и с конкретными примерами ее использо<strong>в</strong>ания <strong>можно</strong> на сайтах<br />
http://is.ifmo.ru и http://www.softcraft.ru.<br />
Эта технология удобна не только для решения задач упра<strong>в</strong>ления<br />
техническими объектами, но, и как будет показано <strong>в</strong> настоящей работе, ее<br />
целесообразно применять при описании <strong>в</strong>нешнего <strong>в</strong>ида динамических<br />
приложений и интернет-страниц с помощью гипер<strong>текст</strong>о<strong>в</strong>ого программиро<strong>в</strong>ания.<br />
Стандартный подход при разработке формата для описания <strong>в</strong>нешнего <strong>в</strong>ида<br />
состоит <strong>в</strong> <strong>в</strong><strong>в</strong>едении <strong>в</strong> гипер<strong>текст</strong>о<strong>в</strong>ый формат для обеспечении его гибкости<br />
дополнительных <strong>в</strong>ста<strong>в</strong>ок, назы<strong>в</strong>аемых скриптами. Скрипты предста<strong>в</strong>ляют собой<br />
<strong>в</strong>ыполняемые программы, и поэтому разработчик должен быть <strong>в</strong>есьма<br />
к<strong>в</strong>алифициро<strong>в</strong>анным программистом.<br />
В данной работе предлагается отказаться от стандартного подхода за<br />
счет применения при проектиро<strong>в</strong>ании программ конечных а<strong>в</strong>томато<strong>в</strong>. При этом<br />
скипты не используются, а формат остается гибким.<br />
Обратим <strong>в</strong>нимание, что описание динамического образа <strong>можно</strong><br />
предста<strong>в</strong>ить <strong>в</strong> некотором абстрактном <strong>в</strong>иде за счет <strong>в</strong>ыделения состояний,<br />
соот<strong>в</strong>етст<strong>в</strong>ующих осно<strong>в</strong>ным стадиям раз<strong>в</strong>ития динамики. Поясним сказанное.<br />
Чело<strong>в</strong>ек предста<strong>в</strong>ляет себе образ того или иного объекта <strong>в</strong> неком<br />
абстрактном <strong>в</strong>иде. Если объект изменяется, то <strong>можно</strong> запомнить несколько его<br />
состояний и причины, при<strong>в</strong>одящие к его переходам из состояния <strong>в</strong> состояние, а не<br />
алгоритм, по которому <strong>можно</strong> построить <strong>в</strong>ид объекта <strong>в</strong> конкретный момент<br />
<strong>в</strong>ремени.<br />
Далее этот подход излагается на примере описания <strong>в</strong>нешнего <strong>в</strong>ида<br />
Windows-приложения – <strong>в</strong>идеопроигры<strong>в</strong>ателя [4]. Для краткости <strong>в</strong>нешний <strong>в</strong>ид<br />
приложения назы<strong>в</strong>ается скином (от английского “skin” – оболочка). Это наз<strong>в</strong>ание<br />
и будет применяться <strong>в</strong> дальнейшем. Отметим, что скин я<strong>в</strong>ляется аналогом<br />
программы <strong>в</strong> традиционном программиро<strong>в</strong>ании, а предлагаемый формат –<br />
аналогом языка программиро<strong>в</strong>ания. Формат за счет применения а<strong>в</strong>томато<strong>в</strong><br />
обеспечи<strong>в</strong>ает не только гибкость, но и простоту разработки скино<strong>в</strong>.<br />
Схема <strong>в</strong>заимодейст<strong>в</strong>ия разработчика, пользо<strong>в</strong>ателя, плейера, скино<strong>в</strong>,<br />
формата и а<strong>в</strong>томато<strong>в</strong> при<strong>в</strong>едена на рис. 1.<br />
Разработчик Скины Crystal Player<br />
А<strong>в</strong>томаты<br />
Формат<br />
Пользо<strong>в</strong>атель<br />
Рис. 1. Схема <strong>в</strong>заимодейст<strong>в</strong>ия, используемая <strong>в</strong> предлагаемом подходе.<br />
В соот<strong>в</strong>етст<strong>в</strong>ии с этой схемой разработчик на базе созданного на осно<strong>в</strong>е<br />
а<strong>в</strong>томато<strong>в</strong> формата проектирует скин. Применение конечных а<strong>в</strong>томато<strong>в</strong><br />
значительно упрощает ему задачу – благодаря а<strong>в</strong>томатам разработчик может<br />
создать динамический скин, не прибегая к скриптам.<br />
Затем пользо<strong>в</strong>атель загружает скин <strong>в</strong> Crystal Player, кардинально меняя<br />
<strong>в</strong>нешний <strong>в</strong>ид проигры<strong>в</strong>ателя.<br />
3
Если <strong>в</strong> <strong>в</strong>ерсии 0.31 проигры<strong>в</strong>атель <strong>в</strong>ыглядел только как стандартное<br />
Windows – окно (рис. 2), то начиная с <strong>в</strong>ерсии 0.32, пользо<strong>в</strong>атель может<br />
достаточно просто изменить <strong>в</strong>нешний <strong>в</strong>ид проигры<strong>в</strong>ателя. На рис. 3 при<strong>в</strong>едены<br />
примеры <strong>в</strong>нешних <strong>в</strong>идо<strong>в</strong> проигры<strong>в</strong>ателя, разработаные студентами СПбГИТМО<br />
(ТУ) Скако<strong>в</strong>ым П. и Саито<strong>в</strong>ым А.<br />
Рис. 2. Традиционный <strong>в</strong>нешний <strong>в</strong>ид проигры<strong>в</strong>ателя Crystal Player<br />
Рис. 3. Внешние <strong>в</strong>иды <strong>в</strong>идеопроигры<strong>в</strong>ателя, разработанные на осно<strong>в</strong>е<br />
но<strong>в</strong>ого формата<br />
4
1. Постано<strong>в</strong>ка задачи<br />
Требуется написать скин для <strong>в</strong>идеопроигры<strong>в</strong>ателя – приложения,<br />
поз<strong>в</strong>оляющего просматри<strong>в</strong>ать на компьютере анимационные файлы (фильмы,<br />
презентации, телепередачи, клипы, концерты, сло<strong>в</strong>ом <strong>в</strong>се, что <strong>можно</strong> записать на<br />
обычную <strong>в</strong>идео кассету для VHS-<strong>в</strong>идеомагнитофоно<strong>в</strong>).<br />
Разработанный гипер<strong>текст</strong>о<strong>в</strong>ый формат поз<strong>в</strong>олит любому чело<strong>в</strong>еку с<br />
помощью <strong>текст</strong>о<strong>в</strong>ого и графического редакторо<strong>в</strong> легко написать динамический<br />
скин, не имея никаких на<strong>в</strong>ыко<strong>в</strong> <strong>в</strong> программиро<strong>в</strong>ании.<br />
Внешний <strong>в</strong>ид приложения соста<strong>в</strong>ляется из графических элементо<strong>в</strong> –<br />
контроло<strong>в</strong>. В скине будет указано, где находится конкретный контрол и какое<br />
изображение (файл <strong>в</strong> <strong>формате</strong> bmp) с ним с<strong>в</strong>язано. Конролы могут быть кнопками,<br />
изображениями и т.д. Если контрол – кнопка, то с ним может быть с<strong>в</strong>язано<br />
несколько изображений (нажатое и отпущенное состояние) и какое-нибудь<br />
дейст<strong>в</strong>ие, например, запустить проигры<strong>в</strong>ание файла. При этом форма <strong>в</strong>сего окна<br />
задается наложением простых геометрических фигур.<br />
Таким образом, достаточно просто описы<strong>в</strong>ается статический скин.<br />
Динамика обычно задается скриптами, но <strong>в</strong> нашем случае это делается иначе и<br />
проще.<br />
А<strong>в</strong>томатный подход поз<strong>в</strong>оляет разбить скин на логически отдельные<br />
соста<strong>в</strong>ные части, которые могут принимать несколько состояний. Например,<br />
панель упра<strong>в</strong>ления с кнопками “Пуск”, “Пауза” и “Стоп” может “прятаться”,<br />
когда <strong>в</strong> ней нет необходимости, и может расширяться, показы<strong>в</strong>ая дополнительные<br />
кнопки “Вперед” и “Назад”. Таким образом, панель упра<strong>в</strong>ления может<br />
принимать три состояния “Спрятана”, “Выд<strong>в</strong>инута”, “Расширена”.<br />
Разработчик описы<strong>в</strong>ает эти состояния и задает пра<strong>в</strong>ила перехода между ними.<br />
Каждая логически отдельная часть скина (например, <strong>в</strong>ышеупомянутая панель)<br />
стано<strong>в</strong>ится для разработчика конечным а<strong>в</strong>томатом, а каждое ее состояние –<br />
состоянием этого а<strong>в</strong>томата.<br />
Для реализации сложного по<strong>в</strong>едения скина а<strong>в</strong>томаты могут<br />
<strong>в</strong>заимодейст<strong>в</strong>о<strong>в</strong>ать между собой. Например, на расширенной <strong>в</strong>ыд<strong>в</strong>инутой панели,<br />
описы<strong>в</strong>аемой а<strong>в</strong>томатом “Панель упра<strong>в</strong>ления” <strong>в</strong> состоянии “Расширена”,<br />
может находиться кнопка помощи (со знаком “?”). При нажатии на эту кнопку<br />
“<strong>в</strong>ыд<strong>в</strong>игается“ другая панель – с <strong>текст</strong>ом помощи. Эта панель, <strong>в</strong> с<strong>в</strong>ою очередь,<br />
также описы<strong>в</strong>ается а<strong>в</strong>томатом “Панель помощи”, который имеет д<strong>в</strong>а состояния -<br />
“Спрятана” и “Выд<strong>в</strong>инута”. Таким образом, кнопка помощи, описы<strong>в</strong>аемая <strong>в</strong><br />
состоянии “Расширена” а<strong>в</strong>томата “Панель упра<strong>в</strong>ления”, задает переход<br />
а<strong>в</strong>томата “Панель помощи” <strong>в</strong> состояние “Выд<strong>в</strong>инута”.<br />
Это очень гибкая <strong>в</strong>оз<strong>можно</strong>сть, которая реализуется использо<strong>в</strong>анием<br />
гипер<strong>текст</strong>а <strong>в</strong>место программиро<strong>в</strong>ания. Достаточно разработать наглядный граф<br />
переходо<strong>в</strong> (рис. 4) и записать <strong>в</strong> <strong>в</strong>ыбранном <strong>текст</strong>о<strong>в</strong>ом <strong>формате</strong>.<br />
Цель работы состоит <strong>в</strong> разработке такого формата и <strong>в</strong>недрение его <strong>в</strong><br />
реальное приложение. Код, поддержи<strong>в</strong>ающий этот формат, оформлен <strong>в</strong> <strong>в</strong>иде<br />
интегриро<strong>в</strong>анного модуля на языке C++. Исходный <strong>текст</strong> этого модуля занимает<br />
180 килобайт кода. Отметим, что этот модуль занимает более 20% кода <strong>в</strong>идео<br />
проигры<strong>в</strong>ателя <strong>в</strong> целом.<br />
5
2. Пример графа переходо<strong>в</strong><br />
Обычно при использо<strong>в</strong>ании конечных а<strong>в</strong>томато<strong>в</strong> разрабаты<strong>в</strong>ают графы<br />
переходо<strong>в</strong>. В данном случае граф переходо<strong>в</strong> поз<strong>в</strong>оляет наглядно иллюстриро<strong>в</strong>ать<br />
<strong>в</strong>заимодейст<strong>в</strong>ие отдельных частей скина. На рис. 4 изображено д<strong>в</strong>а графа<br />
переходо<strong>в</strong>, от<strong>в</strong>ечающих за по<strong>в</strong>едение панелей упра<strong>в</strong>ления и помощи, каждая из<br />
которых предста<strong>в</strong>лена а<strong>в</strong>томатом.<br />
Панель упра<strong>в</strong>ления<br />
Спрятана<br />
Мышь над<br />
панелью<br />
Панель помощи<br />
Мышь<br />
покидает<br />
панель<br />
Выд<strong>в</strong>инута<br />
Кнопки<br />
упра<strong>в</strong>ления<br />
Кнопка<br />
“Расширить”<br />
Нажатие<br />
кнопки<br />
“Помощь”<br />
На панели<br />
Упра<strong>в</strong>ления<br />
Спрятана<br />
Выд<strong>в</strong>инута<br />
Окно помощи<br />
Мышь<br />
покидает<br />
панель<br />
Нажатие<br />
кнопки<br />
“Скрыть”<br />
Расширена<br />
Кнопки<br />
расширенного<br />
упра<strong>в</strong>ления<br />
Нажатие<br />
кнопки<br />
“Расширить”<br />
Кнопка “Скрыть”<br />
Кнопка “Помощь”<br />
Рис. 4. Графы переходо<strong>в</strong>, описы<strong>в</strong>ающие по<strong>в</strong>едение д<strong>в</strong>ух панелей скина<br />
С<strong>в</strong>етлым ц<strong>в</strong>етом отмечены логические единицы – а<strong>в</strong>томаты. Каждый а<strong>в</strong>томат<br />
может находиться <strong>в</strong> одном из состояний. Они отмечены более темным ц<strong>в</strong>етом. В<br />
каждом состоянии описы<strong>в</strong>аются элементы упра<strong>в</strong>ления (самый темный ц<strong>в</strong>ет). Это<br />
могут быть кнопки и <strong>текст</strong>уры. Также <strong>в</strong> поле состояния могут описы<strong>в</strong>аться<br />
некоторые с<strong>в</strong>ойст<strong>в</strong>а (настройки) приложения, например, ц<strong>в</strong>ет списка<br />
проигры<strong>в</strong>аемых файло<strong>в</strong>. С элементами упра<strong>в</strong>ления с<strong>в</strong>язаны определенные<br />
переходы. Например, нажатие кнопки “Скрыть” а<strong>в</strong>томата “Панель упра<strong>в</strong>ления” <strong>в</strong><br />
состоянии “Расширена” пере<strong>в</strong>одит а<strong>в</strong>томат “Панель упра<strong>в</strong>ления” <strong>в</strong> состояние<br />
“Выд<strong>в</strong>инута”. В результате панель упра<strong>в</strong>ления уменьшается, и с нее исчезают<br />
дополнительные кнопки.<br />
Далее мы подробно разберем синтаксис языка описания а<strong>в</strong>томатной<br />
структуры скина.<br />
6
3. Описание синтаксиса<br />
Для описания а<strong>в</strong>томатной структуры скина <strong>в</strong>ыбран широко из<strong>в</strong>естный XML –<br />
формат. Этот формат очень похож на гипер<strong>текст</strong>о<strong>в</strong>ый формат HTML, и поэтому<br />
он понятен многим разработчикам. Кроме того, синтаксический анализатор XML<br />
<strong>в</strong>ключен <strong>в</strong> операционную систему Windows как COM-объект, и поэтому нет<br />
необходимости <strong>в</strong>ручную разбирать грамматику формата.<br />
Формат XML предста<strong>в</strong>ляет собой дре<strong>в</strong>о<strong>в</strong>идную структуру. Каждый узел <strong>в</strong><br />
XML описы<strong>в</strong>ается откры<strong>в</strong>ающим и закры<strong>в</strong>ающим тегом:<br />
тело тега <br />
В “теле тега” могут быть другие узлы – дочерние. Если узел я<strong>в</strong>ляется листом<br />
дере<strong>в</strong>а (без дочерних узло<strong>в</strong>), то его <strong>можно</strong> описать следующим образом:<br />
<br />
“[Параметры]” – это необязательное поле, <strong>в</strong> котором перечисляются некие<br />
параметры тега:<br />
param1=”value1” [param2=”value2”]<br />
Здесь param1 – параметр с именем “param1”, его значение – “value1”.<br />
При<strong>в</strong>едем пример парного тега с д<strong>в</strong>умя параметрами:<br />
…… <br />
Весь скин описы<strong>в</strong>ается между тегами и<br />
. Обязательный параметр “RequiredVersion” – минимальный номер<br />
<strong>в</strong>ерсии программы, необходимой для распозна<strong>в</strong>ания данного скина. Таким<br />
образом, может использо<strong>в</strong>аться следующая запись:<br />
… <br />
Она означает, что минимальный номер <strong>в</strong>ерсии, которая поддержи<strong>в</strong>ает данный<br />
формат – 1.01. Это сделано для со<strong>в</strong>местимости более поздних, расширенных<br />
формато<strong>в</strong> скино<strong>в</strong>. Данный формат уже трижды расширялся – доба<strong>в</strong>лялись но<strong>в</strong>ые<br />
<strong>в</strong>оз<strong>можно</strong>сти, и скины, написанные для старых <strong>в</strong>ерсий программы, корректно<br />
работают. Попытки загрузить но<strong>в</strong>ые скины <strong>в</strong> старую программу безуспешны –<br />
она откажется его интерпретиро<strong>в</strong>ать.<br />
В теле скина <strong>можно</strong> разместить парный тег:<br />
комментарий <br />
В заголо<strong>в</strong>ке обычно помещается наз<strong>в</strong>ание скина. SkinAuthors - а<strong>в</strong>торы,<br />
разработчики и дизайнеры скина. “Комментарий” – некоторая информация о<br />
скине.<br />
7
А<strong>в</strong>томаты <strong>в</strong> скине также описы<strong>в</strong>аются парным тегом:<br />
тело а<strong>в</strong>томата <br />
SwitchName – имя а<strong>в</strong>томата, его уникальный идентификатор <strong>в</strong> рамках скина.<br />
В скине должен присутст<strong>в</strong>о<strong>в</strong>ать как минимум один а<strong>в</strong>томат (хотя бы<br />
комбинационный, имеющий одно состояние). А<strong>в</strong>томаты могут <strong>в</strong>заимодейст<strong>в</strong>о<strong>в</strong>ать<br />
или сущест<strong>в</strong>о<strong>в</strong>ать отдельно. Внешний <strong>в</strong>ид программы собирается по <strong>в</strong>сем<br />
а<strong>в</strong>томатам ее скина по очереди. В “теле а<strong>в</strong>томата” описы<strong>в</strong>аются состояния,<br />
которые он может принимать. Пер<strong>в</strong>ое описанное состояние я<strong>в</strong>ляется исходным. В<br />
нем а<strong>в</strong>томат начинает с<strong>в</strong>ое сущест<strong>в</strong>о<strong>в</strong>ание.<br />
Состояние описы<strong>в</strong>ается парным тегом <strong>в</strong>ида:<br />
тело состояния <br />
StateName – имя состояния, его уникальный идентификатор <strong>в</strong> рамках<br />
а<strong>в</strong>томата. В каждом а<strong>в</strong>томате должно быть описано как минимум одно состояние.<br />
А<strong>в</strong>томат <strong>в</strong>сегда находится <strong>в</strong> одном из с<strong>в</strong>оих состояний. Это состояние целиком<br />
определяет по<strong>в</strong>едение и <strong>в</strong>нешний <strong>в</strong>ид а<strong>в</strong>томата. Описание состояния размещается<br />
<strong>в</strong> “теле состояния”.<br />
Стандартный элемент, описы<strong>в</strong>ающий <strong>в</strong>нешний <strong>в</strong>ид скина – контрол.<br />
Контрол предста<strong>в</strong>ляет собой прямоугольник, который определенным образом<br />
<strong>в</strong>ыглядит и с которым с<strong>в</strong>язаны определенные дейст<strong>в</strong>ия. Он задается следующим<br />
образом:<br />
<br />
Опишем параметры тега:<br />
TLCoord – координата ле<strong>в</strong>ого <strong>в</strong>ерхнего угла контрола. Координаты задаются<br />
относительно одного из четырех угло<strong>в</strong> базо<strong>в</strong>ого окна – окна <strong>в</strong>ы<strong>в</strong>ода изображения,<br />
той прямоугольной части экрана, <strong>в</strong> которую <strong>в</strong>ы<strong>в</strong>одится <strong>в</strong>идео изображение.<br />
Координаты имеют <strong>в</strong>ид: TL(x, y), TR(x, y), BL(x, y), BR(x,y). Эти примеры<br />
соот<strong>в</strong>етст<strong>в</strong>уют координатам относительно ле<strong>в</strong>ого <strong>в</strong>ерхнего, пра<strong>в</strong>ого <strong>в</strong>ерхнего,<br />
ле<strong>в</strong>ого нижнего, пра<strong>в</strong>ого нижнего угла <strong>в</strong>идео окна. Смещение (x, y) может<br />
состоять из отрицательных чисел, а отчет начинается с ле<strong>в</strong>ого <strong>в</strong>ерхнего угла.<br />
Например, topleft=”BR(-10, 15)” означает, что ле<strong>в</strong>ый <strong>в</strong>ерхний угол контрола<br />
находится на 10 пикселей ле<strong>в</strong>ее и на 15 ниже пра<strong>в</strong>ого нижнего угла <strong>в</strong>ы<strong>в</strong>ода<br />
изображения.<br />
8
BRCoord задает координаты пра<strong>в</strong>ого нижнего угла контрола.<br />
ChitMode задает способ упра<strong>в</strong>ления котролом. Это не обязательный параметр.<br />
Его <strong>в</strong>озможные значения:<br />
title – за контрол <strong>можно</strong> “таскать” <strong>в</strong>есь скин. Фактически, данный<br />
контрол <strong>в</strong>едет себя, как заголо<strong>в</strong>ок стандартного окна;<br />
сlient – стандартное упра<strong>в</strong>ление. Если параметр ChitMode не указан<br />
<strong>в</strong>ообще, параметр а<strong>в</strong>томатически принимает данное значение;<br />
top – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин (точнее окно <strong>в</strong>идео<strong>в</strong>ы<strong>в</strong>ода)<br />
также, как за <strong>в</strong>ерхнюю часть стандартного окна;<br />
bottom – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за нижнюю часть<br />
стандартного окна;<br />
left – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за ле<strong>в</strong>ую часть<br />
стандартного окна;<br />
right – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за пра<strong>в</strong>ую часть<br />
стандартного окна;<br />
topleft – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за ле<strong>в</strong>ую<br />
<strong>в</strong>ерхнюю часть стандартного окна;<br />
topright – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за пра<strong>в</strong>ую<br />
<strong>в</strong>ерхнюю часть стандартного окна;<br />
bottomleft – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за ле<strong>в</strong>ую<br />
нижнюю часть стандартного окна;<br />
bottomright – за контрол <strong>можно</strong> растяги<strong>в</strong>ать скин также, как за пра<strong>в</strong>ую<br />
нижнюю часть стандартного окна.<br />
ControlGradient – четыре ц<strong>в</strong>ета, которыми пер<strong>в</strong>оначально зали<strong>в</strong>ается тело<br />
контрола. Ц<strong>в</strong>ета задаются следующим образом:<br />
“#b0g0r0#b1g1r1#b2g2r2#b3g3r3”<br />
b-синяя компонента, g-зеленая, r-красная <strong>в</strong> шестнадцатеричном <strong>в</strong>иде. 0 –<br />
ле<strong>в</strong>ый <strong>в</strong>ерхний угол, 1 – пра<strong>в</strong>ый <strong>в</strong>ерхний, 2 – ле<strong>в</strong>ый нижний, 3 – пра<strong>в</strong>ый нижний.<br />
Например,<br />
gradient=“#001122#a0b0c0#ffffff#8090a0”<br />
Если <strong>в</strong>се четыре ц<strong>в</strong>ета не со<strong>в</strong>падают, контрол будет “залит” градиентом –<br />
ц<strong>в</strong>ет буде пла<strong>в</strong>но изменяться, принимая <strong>в</strong> углах заданные значения.<br />
NormalBitmap – имя растро<strong>в</strong>ого файла (<strong>в</strong> <strong>формате</strong> *.bmp), которым следует<br />
заполнить тело контрола. Если параметр пропущен, контрол не заполняется<br />
<strong>текст</strong>урой. Если при этом не задан и ControlGradient, то контрол окажется<br />
не<strong>в</strong>идимым. Это иногда очень удобно. Расположим, например, контрол по<strong>в</strong>ерх<br />
других и с<strong>в</strong>яжем с ним какие-нибудь дейст<strong>в</strong>ия. В итоге дейст<strong>в</strong>ия <strong>в</strong>ыполняться<br />
будут, а контрол не будет “маячить” на переднем плане.<br />
Если после имени файла поста<strong>в</strong>ить знак <strong>в</strong>опроса и указать ц<strong>в</strong>ет (например<br />
“control.bmp?#102030”), то растро<strong>в</strong>ое изображение будет <strong>в</strong>ы<strong>в</strong>одиться “с ключом” -<br />
<strong>в</strong>се точки файла control.bmp, имеющие ц<strong>в</strong>ет #102030, станут прозрачными. Если<br />
же после знака <strong>в</strong>опроса указать “z” (“control.bmp?z”), то изображение будет<br />
растянуто до размеро<strong>в</strong> контрола. В проти<strong>в</strong>ном случае оно будет многократно<br />
<strong>в</strong>ы<strong>в</strong>одиться на его по<strong>в</strong>ерхности, как <strong>текст</strong>ура.<br />
MouseBitmap – задает растро<strong>в</strong>ое изображение контрола, когда над ним<br />
находится указатель мыши.<br />
9
DownBitmap – задает растро<strong>в</strong>ое изображение контрола, над которым была<br />
нажата ле<strong>в</strong>ая кнопка мыши.<br />
LeftAction – дейст<strong>в</strong>ие, с<strong>в</strong>язанное с нажатием ле<strong>в</strong>ой кнопки мыши. Дейст<strong>в</strong>ие<br />
может я<strong>в</strong>но пере<strong>в</strong>одить произ<strong>в</strong>ольный а<strong>в</strong>томат <strong>в</strong> произ<strong>в</strong>ольное состояние либо<br />
порождать сообщение программе-проигры<strong>в</strong>ателю.<br />
Список допустимых сообщений:<br />
Menu_File - <strong>в</strong>ызо<strong>в</strong> меню “Файл”;<br />
Menu_Subtitles - <strong>в</strong>ызо<strong>в</strong> меню “Субтитры”;<br />
Menu_Playback - <strong>в</strong>ызо<strong>в</strong> меню “Проигры<strong>в</strong>ание”;<br />
Menu_Playlist - <strong>в</strong>ызо<strong>в</strong> меню “Плейлист”;<br />
Menu_View - <strong>в</strong>ызо<strong>в</strong> меню “Просмотр”;<br />
Menu_Options - <strong>в</strong>ызо<strong>в</strong> меню “Настройки”;<br />
Menu_Help - <strong>в</strong>ызо<strong>в</strong> меню “Помощь”;<br />
Maximize или Fullscreen – перейти <strong>в</strong> полноэкранный режим;<br />
Minimize - минимизация окна приложения (с<strong>в</strong>ернуть окно);<br />
Close - закрыть окно;<br />
Menu_Playback_Play - начать (продолжить) проигры<strong>в</strong>ание;<br />
Menu_Playback_Pause - приостано<strong>в</strong>ить проигры<strong>в</strong>ание;<br />
Menu_Playback_Stop - за<strong>в</strong>ершить проигры<strong>в</strong>ание;<br />
Menu_File_Open – открыть <strong>в</strong>идео файл;<br />
Menu_Subtitles_Open – открыть файл субтитро<strong>в</strong>.<br />
Если дейст<strong>в</strong>ие должно пере<strong>в</strong>одить “А<strong>в</strong>томат” <strong>в</strong> определенное состояние,<br />
то <strong>в</strong> качест<strong>в</strong>е параметра следует указать имя-идентификатор а<strong>в</strong>томата и через<br />
точку имя-идентификатор состояния, <strong>в</strong> которое следует перейти а<strong>в</strong>томату. Если<br />
дейст<strong>в</strong>ий несколько, то их следует перечислять через точку с запятой (;).<br />
Например, если требуется за<strong>в</strong>ершить проигры<strong>в</strong>ание и пере<strong>в</strong>ести а<strong>в</strong>томат “Main” <strong>в</strong><br />
состояние “Initial” по нажатию ле<strong>в</strong>ой кнопки мыши, то это записы<strong>в</strong>ается так:<br />
leftaction=“Stop; Main.Initial”<br />
RightAction – дейст<strong>в</strong>ие, с<strong>в</strong>язанное с нажатием на контроле пра<strong>в</strong>ой кнопки<br />
мыши.<br />
MouseAction - дейст<strong>в</strong>ие, с<strong>в</strong>язанное с поя<strong>в</strong>лением над контролом указателя<br />
мыши.<br />
Seal – если устано<strong>в</strong>ить seal=”on”, то при нажатии на контрол, он будет<br />
“западать”, аналогично пунктам стандартного меню. В проти<strong>в</strong>ном случае он будет<br />
<strong>в</strong>ести себя, как обычная кнопка.<br />
С помощью следующего тега описы<strong>в</strong>аются с<strong>в</strong>ойст<strong>в</strong>а плейлиста – списка<br />
проигры<strong>в</strong>аемых файло<strong>в</strong>.<br />
<br />
10
Опишем параметры этого тега.<br />
TLCoord и BRCoord задают положение плейлиста относительно окна<br />
<strong>в</strong>идео <strong>в</strong>ы<strong>в</strong>ода.<br />
BackGroundGradient – градиент, заполняющий фон плейлиста.<br />
ActiveGradient – градиент, использующийся для подс<strong>в</strong>етки акти<strong>в</strong>ного<br />
файла <strong>в</strong> плейлисте.<br />
TextColor – ц<strong>в</strong>ет шрифта, которым печатаются элементы плейлиста.<br />
ActiveColor – ц<strong>в</strong>ет шрифта, которым печатается акти<strong>в</strong>ный, подс<strong>в</strong>еченный<br />
файл <strong>в</strong> плейлисте.<br />
FontName – имя шрифта, которым печатаются элементы плейлиста.<br />
Допускаются любые зарегистриро<strong>в</strong>анные <strong>в</strong> системе шрифты, например “Arial”<br />
или “Times New Roman”<br />
FontHeight – <strong>в</strong>ысота шрифта <strong>в</strong> пикселях.<br />
FontBold – толщина шрифта <strong>в</strong> усло<strong>в</strong>ных единицах (400 – обычный, 600 –<br />
толстый).<br />
Height – ширина одной строки <strong>в</strong> плейлисте <strong>в</strong> пикселях. Отметим, что чем<br />
толще строка, тем крупнее шрифт, если FontHeight не указан.<br />
GroundBitmap - растро<strong>в</strong>ое изображение заднего фона плейлиста – файл<br />
*.bmp. Картинка, зада<strong>в</strong>аемая этим файлом, будет украшать плейлист, находясь <strong>в</strong><br />
его центре на заднем фоне, <strong>в</strong> то <strong>в</strong>ремя, как на переднем фоне будет расположен<br />
список файло<strong>в</strong>.<br />
GrayGroundBitmap – приглушенное изображение заднего фона<br />
плейлиста. Эта картинка заменит предыдущую, если плейлист не пуст. Если этот<br />
параметр опущен, то картинка а<strong>в</strong>томатически генерируется из GroundBitmap –<br />
картинки.<br />
Следующий тег я<strong>в</strong>но указы<strong>в</strong>ает те сообщения, при поя<strong>в</strong>лении которых<br />
а<strong>в</strong>томату следует перейти <strong>в</strong> состояние, <strong>в</strong> котором тег описан:<br />
<br />
При поя<strong>в</strong>лении сообщения Msg, если перед этим а<strong>в</strong>томат имел состояние<br />
StateName или любое другое (когда параметр source опущен), акти<strong>в</strong>изируется<br />
состояние, <strong>в</strong> котором тег описы<strong>в</strong>ается. В этом теге используется параметр<br />
Msg - сообщение, при котором происходит переход.<br />
Этот параметр может принимать три значения:<br />
Play – началось проигры<strong>в</strong>ание файла.<br />
Stop – проигры<strong>в</strong>ание файла закончилось.<br />
Pause – проигры<strong>в</strong>ание приостано<strong>в</strong>лено.<br />
Следующий тег поз<strong>в</strong>оляет указать, чем будет упра<strong>в</strong>лять кла<strong>в</strong>иатура.<br />
<br />
Параметр PlayControl может принимать следующие значения:<br />
On – кла<strong>в</strong>иатура будет использо<strong>в</strong>ана для упра<strong>в</strong>ления проигры<strong>в</strong>анием.<br />
Off – кла<strong>в</strong>иатура будет использо<strong>в</strong>ана для упра<strong>в</strong>ления плейлистом.<br />
Этот тег поз<strong>в</strong>оляет корректно переключаться от упра<strong>в</strong>ления проигры<strong>в</strong>анием к<br />
упра<strong>в</strong>лению плейлистом и обратно. При этом <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ующем состоянии<br />
следует указать , а <strong>в</strong> другом состоянии -<br />
. На рис.5 изображен скин, реализующий<br />
данную <strong>в</strong>оз<strong>можно</strong>сть.<br />
11
Рис. 5. Скин с <strong>в</strong>ыд<strong>в</strong>игающимся плейлистом, реализо<strong>в</strong>анный на а<strong>в</strong>томатах<br />
Следующий тег поз<strong>в</strong>оляет задать положение физического окна Windows<br />
относительно окна <strong>в</strong>идео-<strong>в</strong>ы<strong>в</strong>ода. Логично требо<strong>в</strong>ать, чтобы <strong>в</strong>се контролы и само<br />
окно <strong>в</strong>идео-<strong>в</strong>ы<strong>в</strong>ода лежали <strong>в</strong> пределах этого физического окна.<br />
<br />
Здесь:<br />
TLCoord и BRCoord собст<strong>в</strong>енно координаты физического окна;<br />
Width – толщина рамки <strong>в</strong>округ физического окна <strong>в</strong> пикселях;<br />
Color – ц<strong>в</strong>ет рамки.<br />
Последние д<strong>в</strong>а параметра могут быть опущены.<br />
Для описания с<strong>в</strong>ойст<strong>в</strong> окна <strong>в</strong>идео <strong>в</strong>ы<strong>в</strong>ода используется следующий тег:<br />
<br />
Здесь:<br />
Color - ц<strong>в</strong>ет зали<strong>в</strong>ки пустой области <strong>в</strong>округ <strong>в</strong>ы<strong>в</strong>одимого изображения;<br />
Ground – имя растро<strong>в</strong>ого файла, который будет изображен <strong>в</strong>место <strong>в</strong>идео<br />
пока проигры<strong>в</strong>ание остано<strong>в</strong>лено;<br />
MinWidth, MinHeight, MaxWidth, MaxHeight – ограничения на изменение<br />
размера <strong>в</strong>идео окна;<br />
Форма физического окна скина может быть не прямоугольной и, более того,<br />
может меняться при переходе а<strong>в</strong>томато<strong>в</strong> <strong>в</strong> различные состояния.<br />
Форма окна – пересечение заданных геометрических фигур. Геометрическая<br />
фигура задается тегом .<br />
Прямоугольник с диагональю TLCoord – BRCoord описы<strong>в</strong>ается тегом:<br />
<br />
12
Зададим формат для описания прямоугольника со скругленными краями.<br />
Дополнительные параметры width и height задают горизонтальный и<br />
<strong>в</strong>ертикальный диаметры “скругляющего” эллипса следующим тегом:<br />
<br />
Следующий тег задает эллипс. Параметры TLCoord и BRCoord задают<br />
прямоугольник, <strong>в</strong> который следует <strong>в</strong>писать эллипс.<br />
<br />
Многоугольник задается следующим тегом. В этом теге параметр Countour<br />
задает <strong>в</strong>ершины многоугольника, перечисленные через запятую. Например,<br />
“TL(0, 0), TL(100, 50), TL(50, 100)".<br />
ordercolor=”BorderColor”<br />
popup="Popup"<br />
activepopup=”ActivePopup”<br />
check="Check"<br />
activecheck=”ActiveCheck”<br />
separator="SeparatorGradiend"><br />
Как и <strong>в</strong> теге параметры TLCoord, BRCoord, BackGradient,<br />
ActiveGradient, TextColor, ActiveColor, FontName, FontHeight, FontBold, Height<br />
от<strong>в</strong>ечают соот<strong>в</strong>етст<strong>в</strong>енно за положение строк меню, за градиент фона, за градиент<br />
подс<strong>в</strong>етки, за ц<strong>в</strong>ет <strong>текст</strong>а, за ц<strong>в</strong>ет акти<strong>в</strong>ной строки, за используемый шрифт и за<br />
<strong>в</strong>ысоту строки меню <strong>в</strong> пикселах. Кроме перечисленных <strong>в</strong>ыше, <strong>в</strong> теге имеются<br />
дополнительные параметры:<br />
GrayColor – ц<strong>в</strong>ет недоступного пункта меню;<br />
KeyColor – ц<strong>в</strong>ет “горячих кла<strong>в</strong>иш”, по нажатию на которые <strong>можно</strong> быстро<br />
<strong>в</strong>ызы<strong>в</strong>ать те или иные пункты меню;<br />
KeyActiveColor - ц<strong>в</strong>ет “горячих кла<strong>в</strong>иш” у акти<strong>в</strong>ного пункта меню;<br />
BorderWidth – ширина рамки <strong>в</strong>округ акти<strong>в</strong>ного пункта;<br />
BorderColor – ц<strong>в</strong>ет рамки (градиент) <strong>в</strong>округ акти<strong>в</strong>ного пункта;<br />
SeparatorHeight – <strong>в</strong>ысота разделителя <strong>в</strong> пикселях;<br />
PopupWidth – ширина полоски спра<strong>в</strong>а для иконок <strong>в</strong>ложенных меню;<br />
IconWidth – ширина полоски сле<strong>в</strong>а для иконок-галочек меню;<br />
IconX – горизонтальное смешение картинок иконок;<br />
Popup – имя растро<strong>в</strong>ого файла – иконки, сим<strong>в</strong>олизирующей <strong>в</strong>сплы<strong>в</strong>ающее<br />
<strong>в</strong>ложенное меню.<br />
ActivePopup – имя растро<strong>в</strong>ого файла – иконки, сим<strong>в</strong>олизирующей<br />
<strong>в</strong>сплы<strong>в</strong>ающее <strong>в</strong>ложенное меню для акти<strong>в</strong>ной строки;<br />
Check – имя растро<strong>в</strong>ого файла – иконки, сим<strong>в</strong>олизирующей галочку сле<strong>в</strong>а от<br />
отмеченного пункта меню.<br />
ActiveCheck – имя растро<strong>в</strong>ого файла – иконки, сим<strong>в</strong>олизирующей галочку<br />
сле<strong>в</strong>а от отмеченного пункта меню для акти<strong>в</strong>ной строки;<br />
SeparatorGradient – четыре ц<strong>в</strong>ета, задающие д<strong>в</strong>е горизонтальные линии –<br />
разделитель.<br />
На рис. 6 изображены примеры меню, описанных с помощью данного<br />
формата.<br />
14
Рис. 6. Внешний <strong>в</strong>ид меню, описанных с помощью разработанного формата<br />
Таким образом, простой гипер<strong>текст</strong>о<strong>в</strong>ый формат поз<strong>в</strong>оляет описать скин,<br />
обладающий широкими <strong>в</strong>оз<strong>можно</strong>стями. При<strong>в</strong>едем пример листинга скина,<br />
<strong>в</strong>нешний <strong>в</strong>ид которого изображен на рис. 5.<br />
15
4. Пример использо<strong>в</strong>ания разработанного<br />
формата<br />
Рассмотрим пример, иллюстрирующий простоту описания и одно<strong>в</strong>ременно<br />
широкие <strong>в</strong>оз<strong>можно</strong>сти разработанного формата.<br />
Пусть требуется создать скин, <strong>в</strong>нешний <strong>в</strong>ид которого при<strong>в</strong>еден на рис. 5.<br />
Помимо статической части (ле<strong>в</strong>ая часть рисунка) скин имеет динамическую<br />
соста<strong>в</strong>ляющую – панель с плейлистом. Эта панель может находиться <strong>в</strong> трех<br />
состояниях: “Спрятана”, “Выд<strong>в</strong>инута, но не акти<strong>в</strong>на”, “Выд<strong>в</strong>инута и акти<strong>в</strong>на”.<br />
Граф переходо<strong>в</strong> для динамической части разрабаты<strong>в</strong>аемого скина предста<strong>в</strong>лен на<br />
рис. 7<br />
Панель “Плейлист”<br />
“Спрятана”<br />
Нажатие<br />
кнопки<br />
“Спрятать<br />
плейлист”<br />
Нажатие<br />
кнопки<br />
“Спрятать<br />
плейлист”<br />
Акти<strong>в</strong>ация<br />
осно<strong>в</strong>ного<br />
окна<br />
Кнопка<br />
“Плейлист“<br />
“Выд<strong>в</strong>инута, но<br />
не акти<strong>в</strong>на”<br />
Кнопка<br />
“Спрятать<br />
плейлист”<br />
“Выд<strong>в</strong>инута и<br />
акти<strong>в</strong>на”<br />
Кнопка<br />
“Спрятать<br />
плейлист”<br />
Нажатие<br />
кнопки<br />
“Плейлист”<br />
Акти<strong>в</strong>ация<br />
окна<br />
плейлиста<br />
Рис. 7. Граф переходо<strong>в</strong> для динамической части разрабаты<strong>в</strong>аемого скина<br />
Описание скина<br />
Необходимая <strong>в</strong>ерсия проигры<strong>в</strong>ателя, поддержи<strong>в</strong>ающего<br />
данный скин – 0.33<br />
Информация об а<strong>в</strong>торах скино<strong>в</strong> – стандартное поле<br />
<br />
TV Skin<br />
<br />
Описание статической части<br />
Этот а<strong>в</strong>томат может находиться лишь <strong>в</strong> одном состоянии. Он описы<strong>в</strong>ает те<br />
элементы скина, которые остаются неизменными.<br />
Единст<strong>в</strong>енное состояние статической части скина<br />
<br />
Описание плейлиста <strong>в</strong> этом состоянии<br />
Три статичных прямоугольника, из которых состоит статичная часть скина<br />
16
<br />
<br />
Ограничения на изменение размера <strong>в</strong>идео окна<br />
<br />
<br />
<br />
<br />
<br />
Рамка <strong>в</strong>округ <strong>в</strong>идео окна. За нее <strong>можно</strong> "растяги<strong>в</strong>ать" окно<br />
<br />
<br />
<br />
Так <strong>можно</strong> описать содержимое окна – градиент и картинка<br />
<br />
<br />
Далее описаны статичные элементы упра<strong>в</strong>ления и просто <strong>текст</strong>уры<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Динамическая часть<br />
А<strong>в</strong>томат, инкапсулирующий панель плейлиста. Панель может находиться <strong>в</strong> трех состояниях:<br />
“Спрятана”, “Выд<strong>в</strong>инута, но не акти<strong>в</strong>на”, “Выд<strong>в</strong>инута и акти<strong>в</strong>на”.<br />
<br />
Состояние “Спрятана”<br />
<br />
Описание плейлиста <strong>в</strong> этом состоянии<br />
Физическое окно уменьшено<br />
<br />
<br />
Кла<strong>в</strong>иатура упра<strong>в</strong>ляет проигры<strong>в</strong>анием <strong>в</strong>идео документо<strong>в</strong><br />
<br />
17
Кнопка, от<strong>в</strong>ечающая за переход <strong>в</strong> другое состояние (“Плейлист”)<br />
<br />
Состояние “Выд<strong>в</strong>инута и акти<strong>в</strong>на”<br />
<br />
Описание плейлиста <strong>в</strong> этом состоянии<br />
Кла<strong>в</strong>иатура упра<strong>в</strong>ляет плейлистом<br />
<br />
Далее перечислены <strong>в</strong>изуальные контролы "Выд<strong>в</strong>инутого и акти<strong>в</strong>ного" окна<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Кнопки, от<strong>в</strong>ечающие за переходы <strong>в</strong> другие состояния<br />
Кнопка “Спрятать Плейлист”<br />
<br />
Не<strong>в</strong>идимая кнопка “Деакти<strong>в</strong>иро<strong>в</strong>ать”.<br />
<br />
<br />
Состояние “Выд<strong>в</strong>инута, но не акти<strong>в</strong>на”<br />
<br />
Описание плейлиста <strong>в</strong> этом состоянии<br />
Кла<strong>в</strong>иатура упра<strong>в</strong>ляет проигры<strong>в</strong>анием<br />
<br />
Далее описаны <strong>в</strong>изуальные контролы “Выд<strong>в</strong>инутого, но не акти<strong>в</strong>ного“ окна<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
18
<br />
Кнопки, от<strong>в</strong>ечающие за переходы <strong>в</strong> другие состояния<br />
Кнопка “Спрятать плейлист”<br />
<br />
Не<strong>в</strong>идимая кнопка “Акти<strong>в</strong>иро<strong>в</strong>ать плейлист”<br />
<br />
При запуске проигры<strong>в</strong>ания из состояния "Выд<strong>в</strong>инута и акти<strong>в</strong>на" необходимо<br />
деакти<strong>в</strong>иро<strong>в</strong>ать плейлист.<br />
<br />
<br />
<br />
Гла<strong>в</strong>ный скин описы<strong>в</strong>ает <strong>в</strong>нешний <strong>в</strong>ид окон проигры<strong>в</strong>ателя. Внешний <strong>в</strong>ид <strong>в</strong>сплы<strong>в</strong>ающих меню также<br />
описы<strong>в</strong>ается скином. Для этого <strong>в</strong> теле гла<strong>в</strong>ного тега размещается <strong>в</strong>ложенный тег<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
5. Заключение<br />
Если <strong>в</strong> настоящее <strong>в</strong>ремя для сото<strong>в</strong>ых телефоно<strong>в</strong> модно иметь сменные панели<br />
упра<strong>в</strong>ления, то для со<strong>в</strong>ременных <strong>в</strong>иртуальных устройст<strong>в</strong> модно иметь сменные<br />
скины. Ярким примером этого я<strong>в</strong>ляется поддержка скино<strong>в</strong> (тем - themes) <strong>в</strong><br />
системе Windows XP корпорации Microsoft. Скины сейчас я<strong>в</strong>ляются незаменимым<br />
атрибутом любого профессионального приложения, имеющего дружелюбный<br />
интерфейс.<br />
Естест<strong>в</strong>енное желание при разработке любого формата – дать максимальную<br />
гибкость а<strong>в</strong>торам, которые <strong>в</strong> дальнейшем будут использо<strong>в</strong>ать этот формат.<br />
Обычно гибкость достигается за счет усложнения формата - <strong>в</strong><strong>в</strong>едения <strong>в</strong> него<br />
исполняемого кода, для того, чтобы а<strong>в</strong>торы могли писать <strong>в</strong> скинах целые<br />
программы. При этом, однако, поя<strong>в</strong>ляется большая проблема: усложнение<br />
формата сильно уменьшает круг а<strong>в</strong>торо<strong>в</strong>, способных формат понять.<br />
Однако, <strong>в</strong>носить <strong>в</strong> формат скино<strong>в</strong> исполняемый код нет необходимости. Для<br />
описания <strong>в</strong>нешнего <strong>в</strong>ида использо<strong>в</strong>ать код даже странно – гораздо проще описать<br />
несколько статических состояний скина и логику переходо<strong>в</strong> между состояниями.<br />
Благодаря использо<strong>в</strong>анию я<strong>в</strong>ного <strong>в</strong>ыделения состояний логика описы<strong>в</strong>ается<br />
19
гипер<strong>текст</strong>ом. В результате круг людей, способных писать скины, значительно<br />
расширяется.<br />
Примером этого я<strong>в</strong>ляются пять скино<strong>в</strong>, написанные Mario Sernicola [4],<br />
который понял формат и применил его даже без <strong>документации</strong>, только посмотре<strong>в</strong><br />
несколько примеро<strong>в</strong>.<br />
В заключение отметим, что среди уже разработанных скино<strong>в</strong> имеется один<br />
особенный. Он на осно<strong>в</strong>е предложенного подхода моделирует по<strong>в</strong>едение скина,<br />
использующего стандартную <strong>в</strong>изуализацию окон Windows (рис. 2).<br />
А<strong>в</strong>торы надеются, что документация поз<strong>в</strong>олит расширить круг разработчико<strong>в</strong><br />
скино<strong>в</strong> для программы Crystal Player [4] и станет примером для а<strong>в</strong>торо<strong>в</strong> других<br />
программ, нуждающихся <strong>в</strong> поддержке скино<strong>в</strong>. Фрагмент разработанной<br />
<strong>документации</strong> на английском языке при<strong>в</strong>еден <strong>в</strong> [4].<br />
Источники<br />
1. Шалыто А.А. SWITCH – технология http://is.ifmo.ru, http://www.softcraft.ru<br />
2. Microsoft “SDK Media Player Skin Documentation” http://microsoft.com<br />
3. Microsoft “SDK MS XML3.0 Documentation”<br />
4. Сайт программы Crystal Player www.crystalplayer.com<br />
20