Adobe Flash, или компонент Shockware Flash встроить в форму относительно легко. Точнее, также легко как и любой другой ActiveX компонент. Тем не менее, этот процесс не защищен от проблем, например, таких:
Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Добавление Shockware Flash ActiveX компонента в UserControl или на Windows форму.
- Самый простой способ использовать ActiveX элемент это сначало добавить его в панель инструментов (Toolbox).
- После того как элемент добавлен, его можно перенести на UserControl.
- Пенель свойств можно использовать для настройки Flash ActiveX компонента.
- Загрузить SWF ролик вызвав flashCtl.loadMovie(url string);. Если ролик находится на локальном диска, к ему нужно указать полный путь.
Работа с Flash на C# в Windows Forms.
В контроле есть несколько функций, которые могут пригодится для организации взаимодействия приложения с роликом и наоборот.
В зависимости от версии Flash есть разные способы взаимодействия. Начиная с 8ой версии Flash предусмотрен класс ExternalInterface.
Следующий пример демонстрирует установку переменной и вызов метода из C#. Метод имеет не обычный вид. Это XML, формат которого не так просто найти.
public void DoAction()
{
flashCtl.SetVariable("myFlashVariable", "Hello Flash!");
flashCtl.CallFunction("sdf ");
}
Взаимодействие из Flash осуществляется следующим образом:
import flash.external.ExternalInterface;
class Main
{
public static function main(swfRoot:MovieClip):Void
{
var tf:TextField = _root.createTextField("tf",1,10,10,100,100);
var tf2:TextField = _root.createTextField("tf2", 2, 60, 10, 100, 100);
tf.text = "asd";
_root.bcCSharpMessage = function (varName, oldVal, newVal)
{
_root.tf.text = newVal + _root.tf.text;
}
_root.onEnterFrame = function() {
_root.tf2.text = _root.myFlashVariable;
}
_root.onLoad = function ()
{
_root.myFlashVariable = "---";
_root.watch("myFlashVariable", _root.bcCSharpMessage);
fscommand("asd", "asd");
}
_root.loadAndPlayVideo = function(aa:String):String {
_root.tf.text = aa + ":" + _root.tf.text;
return "agadsg";
}
ExternalInterface.addCallback("loadAndPlayVideo", _root, _root.loadAndPlayVideo);
ExternalInterface.call("test");
}
public function Main()
{
}
}
Методы, которые можно вызывать из .NET нужно зарегистрировать. Возвратные значения и вызов обратных методов осуществлен по средствам событий. В ActiveX Flash control для этого есть два события: FSCommand и FlashCall. Кроме того, есть еще два события управления загрузкой: OnProgress и OnReadyStateChange.
Добавление ActiveX Flash в WPF
ActiveX нельзя добавить в WPF напрямую, однако можно добавить Windows Forms Control с ActiveX компонентом. Например, можно создать следующий WPF UserControl:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using AxShockwaveFlashObjects;
namespace FlashEmbed
{
///
/// Interaction logic for FlashWPFControl.xaml
///
public partial class FlashWPFControl : UserControl
{
public FlashControl FlashControl;
public FlashWPFControl()
{
InitializeComponent();
FlashControl = new FlashControl();
FlashFormHost.Child = FlashControl;
}
public AxShockwaveFlash FlashOCX
{
get { return FlashControl.FlashOCX; }
}
public void Dispose()
{
FlashOCX.Dispose();
}
}
}
С таким XAML файлом:
Стоит помнить, что для размеры Flash ActiveX компонента можно задать только во время инициализации.
Решение проблем
Самой распространенной проблемой, с которой столкнулся и я, это невозможность работы ActiveX компонентся для x86 машин работать с программами, собранными для x64. При этом, ошибки могут быть совершенно разнообразными и исходить из внутренностей компонентов. Чтобы это исправить, достаточно заставить студию собирать проект в режиме x86. Все зависимые проекты должны собиратся с той-же x86 конфигурацией. Вот такой вот секрет, с которым по незнанию можно провозится недели.
Метки:C#, Flash, разработка
Похожие статьи
- 7 июля 2008 -- Играем MP3 при загрузке страницы. (1)
- 30 декабря 2008 -- Создаем ASHX хендлер в ASP.NET (1)
- 12 февраля 2009 -- Мультипоточность в Windows.Forms и WPF (6)
- 30 июля 2010 -- DLR 1.0 на примере IronPython 2.6 (0)
- 31 августа 2009 -- CRUD на SQLite (5)
6 сентября, 2009 at 20:41
Замечательная статья. Кратко и по сути.
Большое спасибо!
25 октября, 2009 at 12:23
здравствуйте замечательная статья !
подскажите пожалуйста почему после «pablish project»
Флеш в проекте перестаёт работать ?