Картинка блога

Adobe Flash, или компонент Shockware Flash встроить в форму относительно легко. Точнее, также легко как и любой другой ActiveX компонент. Тем не менее, этот процесс не защищен от проблем, например, таких:
Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Добавление Shockware Flash ActiveX компонента в UserControl или на Windows форму.

  1. Самый простой способ использовать ActiveX элемент это сначало добавить его в панель инструментов (Toolbox).
    screenshot-06022009-12_36_04
    screenshot-06022009-12_42_36
  2. После того как элемент добавлен, его можно перенести на UserControl.
  3. Пенель свойств можно использовать для настройки Flash ActiveX компонента.
    screenshot-06022009-12_50_46
  4. Загрузить 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 компонента можно задать только во время инициализации.

screenshot-06022009-14_10_53

Решение проблем

Самой распространенной проблемой, с которой столкнулся и я, это невозможность работы ActiveX компонентся для x86 машин работать с программами, собранными для x64. При этом, ошибки могут быть совершенно разнообразными и исходить из внутренностей компонентов. Чтобы это исправить, достаточно заставить студию собирать проект в режиме x86. Все зависимые проекты должны собиратся с той-же x86 конфигурацией. Вот такой вот секрет, с которым по незнанию можно провозится недели.

Метки:, ,

2 комментария в “Загрузка Flash в Windows.Forms и WPF.”

  1. Замечательная статья. Кратко и по сути.
    Большое спасибо!

  2. здравствуйте замечательная статья !
    подскажите пожалуйста почему после «pablish project»
    Флеш в проекте перестаёт работать ?