C++ 与 Flash CS3 通信

本文详细介绍了如何在VC++中实现与Flash的通信,包括创建CMFCFlashProgApp与CMFCFlashProgDlg类,设置对话框,实现外部API类与事件回调,以及在VC++与Flash之间传递变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Step14:
1.變數名稱取"m_Flashocx",(可自取)。
2.按下[完成]鍵。

下面是台湾友人的文章(图片看不到,要看本人翻墙去),他用的是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部份的程式碼:

Step7:
1.產生CMFCFlashProgApp與CMFCFlashProgDlg類別。
2.按下[完成]鍵,完成dialog設定。

Step10:
1.在左邊Dialog視窗內點擊滑鼠右鍵。
2.彈出視窗選擇[插入ActiveX控制項(X)...]。

上次研究的是C++与Flash CS2的通信,在Flash代码中,外部API函数只需写在主时间轴的第一帧便可。
http://mxmkeep.blog.163.com/blog/static/10649241520097281615287/edit/
但FlashCS3又做了些变化,很多采用AS脚本编程,而不是简单的界面设计。因此外部API函数,需写在Flash的主程序类中,就是Flash启动时,第一个调用的类。由于不懂Flash设计,看源码也看不大懂,以是找了两天,通过翻墙找到台湾友人的一篇文章,才搞成功了。主要是包含外部API类,然后在机关函数或初始化函数中声明外部API函数便可。

Step2:
1.專案類型選擇MFC。
2.類型選擇MFC應用程式。
3.為專案設定位置與名稱。
4.設定完按下[確定]鍵。

Step13:
1.在控制項上點擊滑鼠右鍵。
2.彈出視窗選擇[到场變數(B)...]。

Step3:
1.使用MFC應用程式精靈來幫忙設定。
2.按[下一步>]。

Step4:
1.應用程式類型選擇以對話圆塊為基礎(D)。
2.專案樣式為MFC標準。
3.使用MFC的共用DLL。
4.按[下一步>]。

Step5:
1.將最大化與功能表取消。
2.按[下一步>]。

Step6:
1.進階不做修改,直接[下一步>]。

Step21:
於VC程式中自動新增以下程式碼:
VC程式碼:
BEGIN_EVENTSINK_MAP(CMFCFlashProgDlg, CDialog)
ON_EVENT(CMFCFlashProgDlg, IDC_SHOCKWAVEFLASH1, 150,
CMFCFlashProgDlg::FSCommandShockwaveflash1,VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()

Step8:
1.完成設定後可看到自動產生的對話框視窗。

Step20:
1.而要從Flash傳遞給VC則需要新增FSCommand事件,
2.點選<到场>FSCommandShockwaveflash12。


2009年7月10日星期五
【教學】VC++與Flash溝通(二)
Step1:
1.開啟VS2005,建立一個新專案。

Step11:
1.選取Shockwave Flash Object選項。
2.按下[確定]鍵。

Step12:
1.出現黑色圆塊的Flash OCX控制項默示成功到场。

Step9:
1.點選右邊[資源檢視]標籤。

转自http://mxmkeep.blog.163.com/blog/static/1064924152010023290254/

Step16:
1.選取[圆案總管]。
2.標頭檔多了shockwaveflash1.h檔,
3.原始程式檔多了shockwaveflash1.cpp檔。

Step17:
1.選取MFCFlashProgDlg.h檔。
2.#include "shockwaveflash1.h"自動被添加。
3.在//程式碼實作 public:裡
有 CShockwaveflash1 m_Flashocx;
默示控件已宣告。

Step15:
1.觀察[類別檢視],
2.多了CShockwaveflash1這個類別。

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

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);
758同城5 }
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 }

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值