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     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);
    }
    }
}

 

posted @ 2010-04-15 16:57  rob_2010  阅读(822)  评论(0编辑  收藏  举报