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文档,里面有详细解释

demo版本所展示的部分功能: 1、创建窗口 2、设置窗口宽高,标题 3、拖拽边缘缩放窗口,拖拽窗口 4、双击顶端的标题栏,最大化和缩放 5、实现不同的窗口机制 等等……………… core核心包结构初略讲解: IWindow接口:定义所有窗口,并且Window实现了该接口 Module类:模块基类 PopModule类:弹出型环境类,继承Module PopWindow类:弹出型窗口,继承Window Window类:窗口基类 WindowEvent类:窗口事件类 WindowsManager类:窗口管理基类 core核心包实现讲解: 凡是flash cs3中继承Module的元件,都可以直接在元件的第一帧撰写代码,并且在编译的过程中会自动把代码编译出来并继承Module类,在第一帧所拽写的代码可以通过实例化后来访问,比如下面贴出的"控制台源码"就是如此写的 如果需要提供特殊环境等,可以继承Module撰写,比如PopModule,控制台的父类就是PopModule,在控制台的源码中,我们可以看得到他直接访问了window属性,得到的就是控制台所在的窗口对象 Window类实现了基本窗口操作,比如拖拽,关闭,显示等,与WindowManager是配套使用 如果需要更复杂的窗口,可以继承Window类撰写,比如PopWindow,FixedWindow类的父类就是PopWindow,在FixedWindow中,我们只需要把PopWindow的状态和模式定死在window和fixed就可以了,而PopWindow本来就是一个普通的窗口,因此创建Create窗口的时候,直接使用PopWindow即可创建一个普通的窗口,在PopWindow中,默认窗口的状态和模式都为window 核心包是另外一个公司做的。核心代码是反编译过来的。代码经过测试能正常运行。 此代码仅供学习,请勿传播。 flash版窗体系统demo观看地址:http://www.xiaos8.com/uploads/flash/window.swf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值