C#のアプリにFlash(swf)を埋め込む。を参照。
Visual C++を使用すれば、ほとんど同じ方法で埋め込むことができる。
1.準備
1-0
埋め込んで、表示するだけのswfを用意する。
↓これをダウンロードし、展開しておく。EmbedFlash.swfが入っている。
EmbedFlash.zip
ソースコードは最後に記述した。
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
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]