10.06.2015 Views

Отсюда можно скачать полный текст документации в формате pdf

Отсюда можно скачать полный текст документации в формате pdf

Отсюда можно скачать полный текст документации в формате pdf

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!