准备工作

下面测试于: vs2008

1.选择“工具箱”,单击鼠标右键,在弹出的快捷菜单中选择“选择项”。
2.弹出“选择工具箱项”对话框,选择“COM组件”选项卡。
3.在COM组件列表,单击[浏览]按钮,在对话框中选择"//system32/Macromed/Flash/SWFLASH.OCX"。

在工具箱的容器面板里有个MacroMedia Flash Factory Object
而且自动添加了引用AxShockwaveFlashObjects, ShockwaveFlashObjects

如果工具箱中已经有了,可以删除重新添加,以便自动添加引用。


在放入窗体中时报错“未能导入 ActiveX 控件。请确保他已正确注册”.
所以手动添加如下代码:

 

( 1 ) 在Form1.Designer.cs中的最下方与其他定义控件语句放一块定义:
private AxShockwaveFlashObjects.AxShockwaveFlash FlashBox;

(
2 ) 在在Form1.Designer.cs中private void InitializeComponent()方法中添加2条语句:
this .FlashBox = new AxShockwaveFlashObjects.AxShockwaveFlash();
this .Controls.Add( this .FlashBox);

 

接下来就可以在Form [设计]中可视化编程了,以上语句也会自动规格化。

 

 

 

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

下图是我做的一个 demo 程序的界面:

flash_cs.jpg

要在 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( " <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# winform):

flash1.LoadMovie(0,Application.StartPath+"/showstring.swf");
flash1.CallFunction("<invoke name=/"test/" returntype=/"xml/"><arguments><string>Helloworld</string></arguments></invoke>");
flash端:
①添加一个文本框text_txt以显示效果或用trace("call: "+result+"")
②ActionScript代码为,其中result只是参数,而主程序端使用AS的函数时不需要关心参数名,只有知道有参数个数,或参数位置
function test(result:Object):Void{
   test_txt.text=result;
}
flash.external.ExternalInterface.addCallback("test", this, test);

从以上可以看出,在flash8.0新多版本里flash对外部程序调用其actionscript脚本函数时,已经支持,并且是用Xml传递参数了,这样给很多程序员带来极大多方便和开发灵感

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐