一切福田,不離方寸,從心而覓,感無不通。

使用Flash和C# WinForm配合打造界面漂亮的应用程序

(木野狐 2006-10-29)

 

由于之前一阵公司一个项目提出的需求,自己也想进行这方面的尝试,我对如何使用 Flash 来做 WinForm 程序的界面产生了兴趣,于是学习了一些资料,摘要于此。

 

要在 WinForm 中使用 Flash,通常需要用到 Shockwave Flash Object 这个 COM 组件。

 

(http://www.codeproject.com/csharp/fscommand.asp)

 

(http://www.codeproject.com/useritems/FlashDBInteract.asp)

 

具体步骤如下:

 

首先添加对 COM 组件 Shockwave Flash Object 的引用,将该组件拖到窗体上之后,可以设置如下关键属性:

 

Movie: Flash 的存放地址

 

EmbedMovie: 是否嵌入到程序的资源中。

 

接下来你可以设置其他一些属性,使得 Flash 的窗口最大化,隐藏掉其宿主程序的 C# WinForm 窗体。

 

在 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("

 

" name=\"loadAndPlayVideo\" returntype=\"XML\">

 

" + fileDialog.FileName +

 

"");

 

在 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

from url:http://zhangpingan2005.blog.163.com/blog/static/672295422010319103824445/