as3与C++通信,缩放

C++ 与 Flash CS3 通信
From:http://mxmkeep.blog.163.com/blog/static/1064924152010023290254/

    上次研究的是C++与Flash CS2的通信,在Flash代码中,外部API函数只需写在主时间轴的第一帧即可。
http://mxmkeep.blog.163.com/blog/static/10649241520097281615287/edit/
但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);
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值