C++ 与 Flash CS3 通信
上次研究的是C++与Flash CS2的通信,在Flash代码中,外部API函数只需写在主时间轴的第一帧即可。
http://mxmkeep.blog.163.com/blog/static/10649241520097281615287/edit/
但FlashCS3又做了些变化,很多采用AS脚本编程,而不是简单的界面设计。因此外部API函数,需写在Flash的主程序类中,就是Flash启动时,第一个调用的类。由于不懂Flash设计,看源码也看不大懂,所以找了两天,通过FQ找到台湾友人的一篇文章,才搞成功了。主要是包含外部API类,然后在构造函数或初始化函数中声明外部API函数即可。
下面是台湾友人的文章(图片看不到,要看自己FQ去),他用的是VC2005,VC2008、VC6、C++ builder用法类似 :
【教學】VC++與Flash溝通(一)
有時後會需要VC嵌入Flash一起製作專案,
Flash要如何與VC++等外部程式溝通呢?
原本在ActionScript2.0時非常容易,
只需要LoadVars與Fscommand就行了。
但是到了ActionScript3.0較複雜,
主要使用到ExternalInterface與fscommand,
以下測試的範例就是製作一個紅色的球,
球由起始點往右移動,
當到達X座標250時變會停住不動,
此時由VC++程式按扭來控制Flash的球,
讓他回到起始點重新移動。
VC++也可直接改變Flash的變數值。
而Flash在場景上按滑鼠時也會通知VC。
以下為Flash AS3部分的程式碼:
1 package
2 {
3 imp
4 imp
5 imp
6 imp
7 imp
8 imp
9 imp
10 imp
11 imp
12 imp
14 public class AS3TestProg extends MovieClip
15 {
16 public var testnum:String;
17 public var shapobj:Shape;
18 public var field:TextField;
19 public var strTest1:String;
20 public var strTest2:String;
21 public var strTest1txt:TextField;
22 public var strTest2txt:TextField;
23
24 public function AS3TestProg()
25 {
26 testnum = "準備接收VC傳來的字串訊息.";
27 field = new TextField();
28 field.width = 300;
29 field.height = 20;
30 field.x = 50;
31 field.y = 50;
32 addChild(field);
33
34 strTest1 = "測試字串1";
35 strTest1txt = new TextField();
36 strTest1txt.width = 300;
37 strTest1txt.height = 20;
38 strTest1txt.x = 50;
39 strTest1txt.y = 70;
40 addChild(strTest1txt);
41
42 strTest2 = "測試字串2";
43 strTest2txt = new TextField();
44 strTest2txt.width = 300;
45 strTest2txt.height = 20;
46 strTest2txt.x = 50;
47 strTest2txt.y = 90;
48 addChild(strTest2txt);
49
50 init();
51 }
52 public function init():void
53 {
54 stage.stageWidth = 550;
55 stage.stageHeight = 400;
56 stage.frameRate = 24;
57 stage.scaleMode = StageScaleMode.NO_SCALE;
58 stage.align = StageAlign.TOP_LEFT;
59
60 shapobj = new Shape();
61 shapobj.graphics.beginFill(0xFF0000, 100);
62 shapobj.graphics.drawCircle(0, 0, 10);
63 shapobj.graphics.endFill();
64 shapobj.x = 10;
65 shapobj.y = 10;
66 addChild(shapobj);
67 stage.addEventListener( MouseEvent.CLICK, on
68
69 //與外部溝通
70 if (ExternalInterface.available)
71 {
72 //與VC++溝通的介面(VC傳值給Flash變數)
73 ExternalInterface.addCallback("CallMeFromApplication", InternalFunction);
74 ExternalInterface.addCallback("CallMeFromApplication2", CallbackFunction);
75 }
76
77 addEventListener(Event.ENTER_FRAME, on
78 }
79
80 //建立與VC++溝通的介面(VC傳值給Flash變數)
81 public function InternalFunction(Str1:String ,Str2:String ):String
82 {
83 this[Str1] = Str2;
84 return "the function was called successfully";
85 }
86
87 //建立與VC++溝通的介面(VC傳值給Flash變數)
88 public function CallbackFunction(Str1:String ,Str2:String ):String
89 {
90 this[Str1] = Str2;
91 return "the function was called successfully";
92 }
93
94 public function on
95 {
96 //trace("click");
97 //與VC++溝通的介面(Flash呼叫VC)
98 fscommand( "ASCallVC", "true");
99 }
100
101 public function on
102 {
103 field.text = testnum;
104 strTest1txt.text = strTest1;
105 strTest2txt.text = strTest2;
106
107 if ( strTest2 == "ReSetFrame")
108 {
109 shapobj.x = 10;
110 strTest2 = "重新開始";
111 }
112
113 shapobj.x += 1;
114 if(shapobj.x>=250)
115 {
116 shapobj.x = 250;
117 strTest2 = "到達終點"
118 }
119 }
120 }
121 }
2009年7月10日星期五
【教學】VC++與Flash溝通(二)
Step1:
1.開啟VS2005,建立一個新專案。
Step2:
1.專案類型選擇MFC。
2.類型選擇MFC應用程式。
3.為專案設定位置與名稱。
4.設定完按下[確定]鍵。
Step3:
1.使用MFC應用程式精靈來幫忙設定。
2.按[下一步>]。
Step4:
1.應用程式類型選擇以對話方塊為基礎(D)。
2.專案樣式為MFC標準。
3.使用MFC的共用DLL。
4.按[下一步>]。
Step5:
1.將最大化與功能表取消。
2.按[下一步>]。
Step6:
1.進階不做修改,直接[下一步>]。
Step7:
1.產生CMFCFlashProgApp與CMFCFlashProgDlg類別。
2.按下[完成]鍵,完成dialog設定。
Step8:
1.完成設定後可看到自動產生的對話框視窗。
Step9:
1.點選右邊[資源檢視]標籤。
Step10:
1.在左邊Dialog視窗內點擊滑鼠右鍵。
2.彈出視窗選擇[插入ActiveX控制項(X)...]。
Step11:
1.選取Shockwave Flash Object選項。
2.按下[確定]鍵。
Step12:
1.出現黑色方塊的Flash OCX控制項表示成功加入。
Step13:
1.在控制項上點擊滑鼠右鍵。
2.彈出視窗選擇[加入變數(B)...]。
Step14:
1.變數名稱取"m_Flashocx",(可自取)。
2.按下[完成]鍵。
Step15:
1.觀察[類別檢視],
2.多了CShockwaveflash1這個類別。
Step16:
1.選取[方案總管]。
2.標頭檔多了shockwaveflash1.h檔,
3.原始程式檔多了shockwaveflash1.cpp檔。
Step17:
1.選取MFCFlashProgDlg.h檔。
2.#include "shockwaveflash1.h"自動被添加。
3.在//程式碼實作 public:裡
有 CShockwaveflash1 m_Flashocx;
表示控件已宣告。
Step18:
1.接下來可以到MFCFlashProgDlg.cpp裡
的BOOL CMFCFlashProgDlg::On
函式裡建立實體以下為增加的程式碼片段。
VC程式碼:
//--------------------------------------主視窗
CMFCFlashProgDlg::MoveWindow(0,0,640,480,1);
CMFCFlashProgDlg::ShowWindow(SW_SHOW);
//--------------------------------------Flash物件
hwndflash = m_Flashocx.GetSafeHwnd();
m_Flashocx.SetParent(this);
m_Flashocx.MoveWindow( 0, 0, 550, 400, 1);
m_Flashocx.ShowWindow(SW_SHOW);
FlashName = _T("C://AS3TestProg.swf");
m_Flashocx.put_Movie(FlashName);
m_Flashocx.put_Menu(false);
m_Flashocx.put_Playing(true);
Step19:
1.接下來新增一個Button1(按鈕1),
在按鈕上點擊兩下進入函式內,
將VC要與Flash溝通的程式碼加入其中,
以下為增加的程式碼片段。
VC程式碼:
void CMFCFlashProgDlg::On
{
// TODO: 在此加入控制項告知處理常式程式碼
CString XMLSTR;
CString res;
CString strStartFunction;
CString strVarable;
CString strValue;
CString strEndFunction;
//回呼函式名稱
strStartFunction = _T("<invoke name='CallMeFromApplication'>");
//Flash變數名
strVarable = _T("<arguments><string>strTest1</string></arguments>");
//Flash變數值
strValue = _T("<arguments><string>VC++SendFlash</string></arguments>");
//結束標籤
strEndFunction = _T("</invoke>");
XMLSTR = strStartFunction + strVarable + strValue + strEndFunction;
// 傳遞變數值給Flash
res = m_Flashocx.CallFunction(XMLSTR);
}
Step20:
1.而要從Flash傳遞給VC則需要新增FSCommand事件,
2.點選<加入>FSCommandShockwaveflash12。
Step21:
於VC程式中自動新增以下程式碼:
VC程式碼:
BEGIN_EVENTSINK_MAP(CMFCFlashProgDlg, CDialog)
ON_EVENT(CMFCFlashProgDlg, IDC_SHOCKWAVEFLASH1, 150,
CMFCFlashProgDlg::FSCommandShockwaveflash1,VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()
void CMFCFlashProgDlg::FSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
// TODO: 在此加入您的訊息處理常式程式碼
fscomd = command;
fsargs = args;
//為Flash fscommand的第一個參數
if( fscomd == "ASCallVC" )
{
//為Flash fscommand的第二個參數
if( fsargs=="true" )
{
//可作為Flash傳遞過來想做的事
MessageBoxW( _T("Flash call VC++"), _T("MSG"), MB_OK);
}
}
}