C#与 Flash 程序开发

来源:互联网 发布:java语言数字金字塔 编辑:程序博客网 时间:2024/05/19 04:28

可以尝试以下关键字进行搜索查找其他资料
关键字(C#, FLASH, winform,flash嵌入C# ,FLASH 开发UI界面 )

要在c# winform程序里嵌入FLASH,其实就是直接引用Flash的ocx控件。
那你就需要使用“COM 组件” Shockwave Flash Object。不过这个"Flash.ocx"控件不能直接在“COM 组件”窗口中找到.。
需要我们手动添加,选择菜单中的“工具”--“自定义工具箱”,打开“自定义工具箱”窗口,在“COM 组件”中点击“浏览”键,然后选择“c://WINNT(WINDOWS)//system32//MacromedFlashswflash.ocx"控件,确定后在工具箱中就可以看到“FlashFactory”,“ShockwaveFlash”两个新控件

添加控件注意
我使用的是“xp系统”和FLASH8与flash9都有安装,ShockwaveFlash就是在“C:/WINDOWS/system32/Macromed/Flash/”目录下面(我使用的“Flash9d.ocx”)

当你发现你的ShockwaveFlash程序提示你“没有注册”,那你可能缺少了“Microsoft Multimedia Control, version 6.0”控件,可以先添加这个控件到“工具箱”中。这个控件在“C:/WINDOWS/system32/MCI32.OCX”,如果没有可以通过百度上网下载一个



那我们现在就镶嵌一个FLASH到程序中

Movie: flash 的存放地址
EmbedMovie: 是否嵌入到程序的资源中。


在 InitializeComponent();控件都加载完成后, FlashBox_UI.Movie = Application.StartupPath + "//flashplayer.swf"; 连接嵌入的SWF文件

Form1.cs文件如下:


using
System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace flashShell2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            FlashBox_UI.Movie = Application.StartupPath + "//flashplayer.swf";
        }
    }
}
---------------------------------flash c#通讯--------------------------------------

在 Flash 的 ActionScript 中,可以通过 FSCommand 函数与 hosting app 通信,该函数有两个参数,分别是:

command: 命令名称
parameters: 参数

例子:

on(press){
     fscommand(
"Circule", "Green");
}

在 C# 中,处理 flash 对象的 FSCommand 事件即可。
如果该事件处理函数的 EventArgs 为 e, 则有如下对应关系:

e.command -> flash 中调用 FSCommand 时的 command 参数;
e.args -> flash 中调用 FSCommand 时的 arguments 参数。

在 C# 中往 Flash 传递数值用 SetVariable 方法:

axShockwaveFlash1.SetVariable("variablename", "valueasstring");

对应的,有一个 GetVariable 方法可以获得 flash 中的变量值。

FSCommand 的参数只能传递一个,所以其功能存在一定的局限性。在你需要传递多个参数的时候,则需要在调用方用字符串拼接各个参数值,然后在被调用方重新解开。这种办法使得复杂的传值显得很丑陋。

不过,除了 FSCommand 外,我们还有另一种办法和 flash 通信,就是使用 Flash Player 8 External API.
(http://www.codeproject.com/cs/media/flashexternalapi.asp)

使用 External API,可以实现 ActionScript 和 C# 的双向调用。其好处就在于每次调用时的参数和返回值都通过一个 xml 文档来传递,这样就比 FSCommand 功能完善了很多。当然在 C# 中,我们也需要声明一下外部函数实现的对应关系。

代码片段:
Flash ActionScript 中声明提供给 hosting application 调用的回调函数:

import flash.external.ExternalInterface;
ExternalInterface.addCallback(
"loadAndPlayVideo", null, loadAndPlayVideo);

C# 中调用 Flash 的情形:

      flashPlayer.CallFunction("<invoke" +
          
" name=/"loadAndPlayVideo/" returntype=/"xml/">
          <arguments><string>" + fileDialog.FileName +
          "</string></arguments></invoke>");

在 ActionScript 中调用 C# 函数:

ExternalInterface.call("ResizePlayer",
       videoPlayer.metadata.width, videoPlayer.metadata.height);

在 C# 中声明被 Flash 调用的函数:

flashPlayer.FlashCall +=
  
new _IShockwaveFlashEvents_FlashCallEventHandler(flashPlayer_FlashCall);

在此,我们可以看到 C# 和 Flash 进行通信还是相当方便的。

除此之外,我顺便搜索到其他一些和 flash 有关的不错的文章:

Flash and .NET with FlashRemoting
http://www.codeproject.com/aspnet/FlashRemoting.asp

Multiple File Upload With Progress Bar Using Flash and ASP.NET
http://www.codeproject.com/aspnet/FlashUpload.asp

Flash GUI for your exe using minimalistic approach (C++)
http://www.codeproject.com/useritems/FlashGui.asp

C#中的回调函数

axShockwaveFlash.FlashCall +=
     new _IShockwaveFlashEvents_FlashCallEventHandler(SetNum);

public void SetNum(object sender,_IShockwaveFlashEvents_FlashCallEvent e)
   {
//得到参数列表
    ArrayList paraList = GetParaList(e.request);
   }

public ArrayList GetParaList(string ParaListXml)
   {
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(ParaListXml);
   
    XmlNodeList pareNodeList = doc.GetElementsByTagName("string");
   
    ArrayList paraList = new ArrayList();
    foreach(XmlNode node in pareNodeList)
    {
     paraList.Add(node.InnerText);
    }
   
    return paraList;
   }