上次研究的是C++与Flash CS2的通信,在Flash代码中,外部API函数只需写在主时间轴的第一帧即可。
但FlashCS3又做了些变化,很多采用AS脚本编程,而不是简单的界面设计。因此外部API函数,需写在Flash的主程序类中,就是Flash启动 时,第一个调用的类。由于不懂Flash设计,看源码也看不大懂,所以找了两天,通过×××找到台湾友人的一篇文章,才搞成功了。主要是包含外部API类, 然后在构造函数或初始化函数中声明外部API函数即可。下面是台湾友人的文章(图片看不到,要看自己×××去),他用的是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 import flash.display.Stage; 4 import flash.display.StageAlign; 5 import flash.display.StageScaleMode; 6 import flash.display.MovieClip; 7 import flash.display.Shape; 8 import flash.events.Event; 9 import flash.events.MouseEvent; 10 import flash.text.TextField; 11 import flash.external.ExternalInterface;//(Me:用于从C++调用Flash) 12 import flash.system.fscommand;//(用于从Flash调用C++) 13 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, onMouseUpHandle); 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, onEnterFrameHandle ); 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 onMouseUpHandle(event:MouseEvent):void 95 { 96 //trace("click"); 97 //與VC++溝通的介面(Flash呼叫VC) 98 fscommand( "ASCallVC", "true"); 99 } 100 101 public function onEnterFrameHandle(event:Event):void 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::OnInitDialog() 函 式裡建立實體以下為增加的程式碼片段。 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::OnBnClickedButton1() { // 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); } } }