Flash与C#结合,打造完美WinForm程序
? 以其强大的交互性,以其漂亮的界面设计性,Adobe的Flash技术在互联网界已经被广大的开发者和用户所认可,如今很多酷炫的、功能强大的Flash页面已经出现在互联网上,为用户带来了完美的体验
但作为一项前端技术,我们同样希望它能更好的应用于桌面应用程序 我们都知道Adobe的AIR,它是Adobe推出的桌面应用程序开发技术,但由于它功能的局限性,并不被很多开发者认可 与此相比,我们更希望使用功能强大的C#与Flash结合,再配合Visual Studio开发出漂亮的WinForm程序 下面我就来介绍一下Flash与C#间如何通信: 首先我们打开Visual Studio 2010 >> 新建项目?>> Windows窗体应用程序 ,填写好名称、路径,按回车,(本例中把尺寸定位300×300)新建完成 如后我们考虑如何把Flash嵌入到WinForm程序当中,在?Visual Studio 2010 中有一个默认未启用的组件——Shockwave Flash Object,此组件即可加载Flash程序,启用?Shockwave Flash Object 请打开左上角的工具箱,在工具箱中右键单击,选添加选项卡,命名为AAA,然后右键单击?AAA 选项卡,选“选择项”,即可打开“选择工具箱项”对话框,然后单击?“COM组件”,拖动滚动条至接近底端处,你将会看见?Shockwave Flash Object 组件,将其勾选,点确定,如图所示: 此时,?Shockwave Flash Object 组件已添加完成,此组件在工具箱的AAA选项卡中可以看到,然后将此组件拖入WinForm设计视图中,设置大小258×192,然后在工具箱的 公共控件选项卡中分别拖入一个 Button 控件和一个 Label 控件,并且给Button添加单击事件处理函数,如下图: 然后按F7,进入代码编辑器,代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; ? namespace WindowsFormsApplication1 { ?? ?public partial class Form1 : Form ?? ?{ ?? ? ? ?public Form1() ?? ? ? ?{ ?? ? ? ? ? ?InitializeComponent(); ?? ? ? ? ? ?label1.Text = "Button"; ?? ? ? ? ? ?axShockwaveFlash1.Movie = Application.StartupPath + "CallAPP.swf"; //加载同路径下的CallAPP.swf文件 ?? ? ? ? ? ?//Flash每次调用C#中的函数时,C#中会有一个事件响应,此事件由?axShockwaveFlash1 来接收 ?? ? ? ? ? ?axShockwaveFlash1.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(axShockwaveFlash1_FlashCall); ?? ? ? ?} ?? ? ? ?private void axShockwaveFlash1_FlashCall(object sender,AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)//向as发送请求 ?? ? ? ?{ ?? ? ? ? ? ?XmlDocument document = new XmlDocument(); ?? ? ? ? ? ?//Flash与C#之间通信其实就是互相传输数据,数据格式是XML格式,存储于事件对象的?request 属性中 ?? ? ? ? ? ?document.LoadXml(e.request); ?? ? ? ? ? ?// 得到信息并解析 ?? ? ? ? ? ?XmlAttributeCollection attributes = document.FirstChild.Attributes; ? ?? ? ? ? ? ?// get function ?? ? ? ? ? ?String command = attributes.Item(0).InnerText; ? ?? ? ? ? ? ?// get parameters ?? ? ? ? ? ?XmlNodeList list = document.GetElementsByTagName("arguments"); ?? ? ? ? ? ?String arg = list.Item(0).InnerText; ? ?? ? ? ? ? ?switch (command) ?? ? ? ? ? ?{ ?? ? ? ? ? ? ? ?case "callCSharp": ?? ? ? ? ? ? ? ? ? ?callCSharp(arg); ?? ? ? ? ? ? ? ? ? ?break; ?? ? ? ? ? ?} ?? ? ? ?} ? ?? ? ? ?private void button1_Click(object sender,EventArgs e) ?? ? ? ?{ ?? ? ? ? ? ?callFunction("output","why?"); ? ? ? ? ? ? ?//调用as中的output()函数,why?为参数 ?? ? ? ?} ? ?? ? ? ?private void callFunction(string funName,string arg) ?? ? ? ?{ ?? ? ? ? ? ?//C#传给Flash的值 ?? ? ? ? ? ?axShockwaveFlash1.CallFunction("<invoke name="" + funName + "" returntype="xml"><arguments><string>" + arg + "</string></arguments></invoke>"); ?? ? ? ?} ? ?? ? ? ?public void callCSharp(String _str) ?? ? ? ?{ ?? ? ? ? ? ?label1.Text = _str; ?? ? ? ? ? ?axShockwaveFlash1.SetReturnValue("<string>" + _str + "</string>"); ? ? ? ? ? ? //C#给Flash返回的值 ?? ? ? ?} ?? ?} } 此时WinForm程序已经写完了,先不用发布,配合此WinForm程序的SWF文件应该满足以下条件: 1:必须和WinForm程序同路径,且名为 “CallAPP.swf”; ?? ? ? 2:舞台大小为258×192; 3:必须有一个名为?“output” 的且可供外部调用的公共函数,且具有一个 String 类型参数; 4:C#中有一个名为?“callCSharp” 的函数可供Flash程序调用,此SWF文件中必须可以调用此函数,并且能接受其返回值; 下面我们就来编写Flash程序 在Flash CS4 中新建Flash AS3 文件,命名为“CallAPP”,设置舞台大小258×192,舞台上将放置一个名为“txt”的动态文本框,和一个名为“btn”的按钮,适当调整其大小和位置,选中第一帧,按F9,开始编写代码: var isAvailable:Boolean=ExternalInterface.available; txt.text=isAvailable.toString(); if (isAvailable==true) { ExternalInterface.addCallback("output",output);//这是外部接口,让C#可以调用 btn.addEventListener(MouseEvent.CLICK,onClick); } function output(str:String):void { txt.text=str; } function onClick(e:MouseEvent):void { txt.text = ExternalInterface.call("callCSharp","it has been called");//调用C#中的函数 } 代码已编写完成,将此文件发布到与WinForm程序相同的路径中 回到WinForm程序中,按F5发布程序,测试即可。 ? 到此程序已全部写完,Flash与C#之间通信是以XML格式传输的,可以传输String、Number、Array、Object等类型,并且可以传输复杂的可自定义的数据类型,有关数据类型与XML格式编写请查阅 Adobe 的AS3文档,里面有详细解释 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |