Путь разработчика

Сборник полезных примеров и советов для .NET программистов

Windows.Forms и Flash, способы внедрения роликов

2009-10-07 от Kosten

Данная статья посвящена тому, какими способами можно отображать Flash ролики на Windows.Forms и какими способами можно ими управлять.
Задача может и не относится к распространенным, но возможно кому-то захочется добавить “изюминку” в свое приложение в виде векторной графики, анимации, звуков и т д.
Способов встроить Flash ролик в форму - 2 (представлены ниже).
1. С помощью компонента обозревателя - System.Windows.Forms.WebBrowser.
Действия: перетянуть на форму компонент WebBrowser или создать и настроить его руками, установить ему свойство Url - путь к ролику (.swf) или к .html в котором всторен флеш объект.

private System.Windows.Forms.WebBrowser webBrowser1;
    ...
    this.webBrowser1 = new System.Windows.Forms.WebBrowser();
    this.webBrowser1.Location = new System.Drawing.Point(14, 236);
    this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
    this.webBrowser1.Name = "webBrowser1";
    this.webBrowser1.Size = new System.Drawing.Size(250, 131);
    this.webBrowser1.Url = new System.Uri("c:\\tmp\\simple.swf", System.UriKind.Absolute);

Достоинства: простота
Недостатки: нет возможности получать комманды от ролика и управлять им
Способ подходит для простого отображения флеш контента. Если роликом нужно управлять или получать от него комманды, - необходимо воспользоваться вторым способом.

2. С помощью AxtiveX компонента Shockware Flash Object.
Действия:
- в VS 2005 правой кнопкой кликнуть на поле Toolbox, в контекстном меню выбрать Choose Items.
- в появившемся окне Choose Toolbox Items перейти на закладку COM Components, выбрать Shokware Flash Object
(я использую Debug версию 9 плеера, у меня это - c:\Windows\system32\Macromed\Flash\FlDbg9.ocx).
- теперь на закладке у нас появился Shockware Flash Object, который можно смело перетянуть на форму.

private AxShockwaveFlashObjects.AxShockwaveFlash flashPlayer;
    this.flashPlayer = new AxShockwaveFlashObjects.AxShockwaveFlash();
    this.flashPlayer.Enabled = true;
    this.flashPlayer.Location = new System.Drawing.Point(13, 12);
    this.flashPlayer.Name = "flashPlayer";
    this.flashPlayer.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("flashPlayer.OcxState")));
    this.flashPlayer.Size = new System.Drawing.Size(300, 200);

- замеченные баги: Если при первой компиляции после добавления ролика выдает ошибку, что не найден только что добавленный компонент - необходимо удалить папки obj, bin в проекте.
Работа с компонентом:
- загрузка ролика в компонент:

string path = "c:\\tmp\\simple.swf";
    flashPlayer.LoadMovie(0, path);

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

on(click) {
        fscommand("sendCmd", 1);
    }

первый параметр - имя комманды, второй - аргумент комманды.
Ловим эту комманду из Windows.Forms :
//подписываемся на событие от ролика на получение fscommand

flashPlayer.FSCommand += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEventHandler(flashPlayer_FSCommand);
    //подписчик:
    void flashPlayer_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
        {
            tbOut.Text += e.command + " (" + e.args + ")" + "\r\n";
        }

при этом - e.command - команда (строка), e.args - аргумент команды (строка). В примере команда добавляется в текстовое поле для отображения.
- управление роликом:
для управления роликом у компонента есть блок методов, начинающихся с T, вот некоторые:

flashPlayer.TPlay("rect_mc");   //стартует MovieClip rect_mc, который находится на сцене ролика
    flashPlayer.TGotoFrame("rect_mc", 1);   //переводит rect_mc на первый кадр
    flashPlayer.TCallFrame("rect_mc", 1);   //вызывает первый кадр rect_mc
    flashPlayer.TStopPlay("rect_mc");       //останавливает проигрывание rect_mc
    flashPlayer.TSetProperty("rect_mc", 1, "50");//установить свойство c индексом 1 в значение "50"
    string s = flashPlayer.TGetProperty("rect_mc", 1);  //считать первое свойство
    int frame = flashPlayer.TCurrentFrame("rect_mc");   //узнать на каком кадре находится ролик.

и еще много вкусного
Данная статья расчитана наверное не на очень широкий круг читателей форума, но вопрос не достаточно освещен в рунете, поэтому я думаю кому-то, но она пригодится. Может кто-то мечтал написать флеш игрушку, но при этом не знал Action Script, прочитав эту статью, это можно сделать теперь на родном C# :-)
Проект с примером не выкладываю, по причине распространенности разных версий флеш плееров и ocx компонентов, но работоспособность приведенного кода будет соблюдаться при наличии флеш плеера версии 6 и старше, возможно и младше - не проверял.
Вопросы и комментарии приветствуются. Спасибо прочитавшим, при распространении ставьте копирайты ;-)

Автор PIL


Вам необходимо платье которое привлечет внимание и будет центром восхищения? Если да, то www.tissura.ru - ткани изысканный выбор от лучших производителей Италии, франции.

Опубликовано Среда, 07-10-2009 в 8:50 пп в рубрики .NET, C#, Develop. Вы можете оставить отслеживать комментарии к записи при помощи RSS 2.0 ленты. Вы можете оставить комментарий, или трекбек с Вашего сайта.

Один комментарий на запись “Windows.Forms и Flash, способы внедрения роликов”

  1. Serg пишет:

    Отличная вводная!
    А можно ли как-то работать с Flash, который встроен в загружаемую из интернета страницу?
    (т.е. управлять роликом командами ActionScript)

Оставить комментарий