C#のアプリにFlash(swf)を埋め込む。


Flashはデジタルサイネージの分野でも広く使われている。ただ、元がウェブ向けの技術なので、OSネイティブの動作と連動しづらい部分もある。この問題を改善する方法としてC#でまずアプリを作って、そこにFlash(swf)を埋め込むという方法がある。
C#はMicrosft推奨のアプリ作成方法なので、OS側(Windows)の機能の十分な活用が可能になる。Flash(swf)がUIレイヤーとなりキレイなアニメーションを担当し足回りはC#で固める、というイメージだ。
ここでは、基本のキとして、C#のプログラムにFlash(swf)を埋め込む方法を紹介する。

ちなみに先日紹介したNativeProcessも似た問題の違う解決方法となる。NativeProcessは連携アプリとAIRの二種のアプリを同時起動させて連動させる方法だ。ここで紹介するのは、C#のWindowsアプリにswfを乗せて再生するので、一つのアプリだけが起動していることになる。

1.準備

1-0

埋め込んで、表示するだけのswfを用意する。
↓これをダウンロードし、展開しておく。EmbedFlash.swfが入っている。
EmbedFlash.zip

Get Adobe Flash player


ソースコードは最後に記述した。

1-1

Visual C# 2010 Expressを起動し、メニューの「ファイル」から「新しいプロジェクト(P)…」を選択します。

1-2

「新しいプロジェクト」ウィンドウが出たら、「Windows フォーム アプリケーション」を選択し、右下の「OK」ボタンを選択する。

1-3

次のような画面になる。

1-4

緑色の三角、「デバッグ開始」をクリックすると、ウィンドウが立ち上がり、動作確認ができる。

何も設定していないので、真っ白のウィンドウが出るだけだ。

1-5

メニューの「ファイル/すべてを保存」を選択する。

1-6

とりあえずこのまま「上書き保存」を選択する。

デフォルトでは、
C:\Users\<user name>\documents\visual studio 2010\Projects
内に保存される(Windows Vista)。

1-7

C:\Users\<user name>\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\内に先ほどダウンロードした、EmbedFlash.swfを配置する(リリース用ビルドの場合には、Releaseディレクトリ内に配置する)。

1-8

Visual C# 2010 Expressに戻る。
このままだと、基本機能しかメニューに出てこないので、メニューの「ツール/設定/上級設定」を選択する。

1-9

メニュー項目に「ビルド」が増えたのを確認する。

とりあえず、準備完了。

2.制作

2-1

それぞれのメニュー内の項目も増えている。「ツール/ツールボックス アイテムの選択」を選択する。

2-2

「ツールボックス アイテムの選択」ウィンドウが出てくる。上のタブから「COM コンポーネント」を選択後、下のほうまでスクロールすると、「Shockwave Flash Object」が現れるので、チェックボックスを選択し、「OK」を選択する。

2-3

左端の「ツールボックス」タブをクリックし、開く。

2-4

下のほうに、「Shockwave Flash Object」が追加されているのを確認し、メニュー項目をドラッグして、ウィンドウ内に持ってくる。

2-5

ドロップすると、四角いエリアが表示される。これが、Flash(swf)が埋め込まれるエリアだ。

2-6

右側にある「ソリューションエクスプローラー」を右クリックして「コードの表示」を選択する。

2-7

「using System.Windows.Forms;」の次の行に
[sourcecode language=”csharp”]
using System.IO;
[/sourcecode]
を書く。

「InitializeComponent();」の次の行に
[sourcecode language=”csharp”]
String swfPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "EmbedFlash.swf";
axShockwaveFlash1.LoadMovie(0, swfPath);
[/sourcecode]
を書く。

ファイルのパスは相対パスではだめで、絶対パスでないといけないので「Directory.GetCurrentDirectory()」でC#アプリのあるディレクトリを取得している。そこに、さらに「Path.DirectorySeparatorChar」で、セパレーター(\)を追加している。
セパレーターを直接書く方式
[sourcecode language=”csharp”]
Directory.GetCurrentDirectory() + "\\EmbedFlash.swf";
[/sourcecode]
でもかまわない。
次の行は、axShockwaveFlash1にswfのパスを渡し、ロードムービーさせている。
[sourcecode language=”csharp”]
axShockwaveFlash1.LoadMovie(0, swfPath);
[/sourcecode]
「axShockwaveFlash1」は、Flashを配置するエリアのことで、2-5でツールをドロップした時点で自動的に命名されている。

2-8

緑色の三角、「デバッグ開始」をクリックすると、ウィンドウが立ち上がり、Flashが埋め込まれているのを確認できる。

3.参考

C#の中にFlashを埋め込む – sappari wiki
http://memo.sappari.org/flash-in-csharp

4.ソースコード

4-1

WindowsFormsApplication1.zip

4-2

▼C#
[sourcecode language=”csharp”]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
String swfPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "EmbedFlash.swf";
axShockwaveFlash1.LoadMovie(0, swfPath);
}
}
}
[/sourcecode]

4-3

▼AS3
[sourcecode language=”as3″]
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;

/**
* …
* @author umhr
*/
[SWF(width = 192, height = 192, backgroundColor = 0xCCCCCC, frameRate = 30)]
public class Main extends Sprite
{
private var _shape:Shape = new Shape();
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point

_shape.graphics.beginFill(0xFF0000, 0.5);
_shape.graphics.drawRoundRect(-75, -75, 150, 150, 8, 8);
_shape.graphics.endFill();
_shape.x = 75;
_shape.y = 75;
addChild(_shape);

addEventListener(Event.ENTER_FRAME, enterFrame);
}

private function enterFrame(event:Event):void
{
_shape.rotation ++;
}

}

}
[/sourcecode]

Comments are closed.