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

C#のアプリにFlash(swf)を埋め込む。を参照。
Visual C++を使用すれば、ほとんど同じ方法で埋め込むことができる。

1.準備

1-0

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

Get Adobe Flash player


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

1-1

Visual C++ 2010 Expressを起動し、メニューの「ファイル(F)」から「新規作成(N)」、「プロジェクト(P)…」を選択する。

1-2

「新しいプロジェクト」ウィンドウが出たら、「Windows フォーム アプリケーション」を選択し、下の「名前(N)」を入力する。(ここではloadswfとした)
プロジェクトの保存場所「場所(L)」は、デフォルトでは、
C:\Users\<user name>\documents\visual studio 2010\Projects になっている。
変更せずにそのまま右下の「OK」ボタンを選択する。

1-3

次のような画面になる。

1-4

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

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

1-5

C:\Users\<user name>\documents\visual studio 2010\Projects\loadswf\loadswf\内に先ほどダウンロードした、EmbedFlash.swfを配置する。

1-6

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

1-7

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

とりあえず、準備完了。

2.制作

2-1

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

2-2

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

2-3

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

2-4

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

2-5

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

2-6

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

2-7

「#pragma once」の次の行に
[sourcecode language=”cpp”]
#include <windows.h>
[/sourcecode]
を書く。

「InitializeComponent();」の次の行に
[sourcecode language=”cpp”]
TCHAR currentPath[MAX_PATH];

GetCurrentDirectory(MAX_PATH, currentPath);

String^ swfPath = gcnew String(currentPath);
swfPath += "\\EmbedFlash.swf";

axShockwaveFlash1->LoadMovie(0, swfPath);
[/sourcecode]
を書く。

ファイルのパスは相対パスではだめで、絶対パスでないといけないので「GetCurrentDirectory()」でC++プロジェクトのあるディレクトリを取得している。
次にTCHAR型で取得したパスをSystem::String型に変換し、そこに、セパレーター(\)とswfファイル名を追加している。
次の行は、axShockwaveFlash1にswfのパスを渡し、ロードムービーさせている。
[sourcecode language=”cpp”]
axShockwaveFlash1->LoadMovie(0, swfPath);
[/sourcecode]
「axShockwaveFlash1」は、Flashを配置するエリアのことで、2-5でツールをドロップした時点で自動的に命名されている。

2-8

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

3.ソースコード

3-1

loadswf.zip

3-2

▼C++
[sourcecode language=”cpp”]
#pragma once

#include <windows.h>

namespace loadswf {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Form1 の概要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();

TCHAR currentPath[MAX_PATH];

GetCurrentDirectory(MAX_PATH, currentPath);

String^ swfPath = gcnew String(currentPath);
swfPath += "\\EmbedFlash.swf";

axShockwaveFlash1->LoadMovie(0, swfPath);

}

protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: AxShockwaveFlashObjects::AxShockwaveFlash^ axShockwaveFlash1;
protected:

private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
this->axShockwaveFlash1 = (gcnew AxShockwaveFlashObjects::AxShockwaveFlash());
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->axShockwaveFlash1))->BeginInit();
this->SuspendLayout();
//
// axShockwaveFlash1
//
this->axShockwaveFlash1->Enabled = true;
this->axShockwaveFlash1->Location = System::Drawing::Point(13, 13);
this->axShockwaveFlash1->Name = L"axShockwaveFlash1";
this->axShockwaveFlash1->OcxState = (cli::safe_cast<System::Windows::Forms::AxHost::State^ >(resources->GetObject(L"axShockwaveFlash1.OcxState")));
this->axShockwaveFlash1->Size = System::Drawing::Size(192, 192);
this->axShockwaveFlash1->TabIndex = 0;
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Controls->Add(this->axShockwaveFlash1);
this->Name = L"Form1";
this->Text = L"Form1";
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->axShockwaveFlash1))->EndInit();
this->ResumeLayout(false);

}
#pragma endregion
};
}
[/sourcecode]

3-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]