使用Flash和C#WinForm配合打造界面漂亮的应用程序由于之前一阵公司一个项目提出的需求,自己也想进行这方面的尝试,我对如何使用Flash来做WinForm程序的界面产生了兴趣,于是学习了一些资料,摘要于此。要在WinForm中使用Flash,通常需要用到ShockwaveFlashObject这个COM组件。()()具体步骤如下:首先添加对COM组件ShockwaveFlashObject的引用,将该组件拖到窗体上之后,可以设置如下关键属性:Movie:Flash的存放地址EmbedMovie:是否嵌入到程序的资源中。接下来你可以设置其他一些属性,使得Flash的窗口最大化,隐藏掉其宿主程序的C#WinForm窗体。在Flash的ActionScript中,可以通过FSCommand函数与hostingapp通信,该函数有两个参数,分别是: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通信,就是使用FlashPlayer8ExternalAPI.()使用ExternalAPI,可以实现ActionScript和C#的双向调用。其好处就在于每次调用时的参数和返回值都通过一个XML文档来传递,这样就比FSCommand功能完善了很多。当然在C#中,我们也需要声明一下外部函数实现的对应关系。c#调用ActionScript中的函数代码片段:FlashActionScript中声明提供给hostingapplication调用的回调函数:importFlash.external.ExternalInterface;functionloadAndPlayVideo(uri:String):Void{videoPlayer.contentPath=uri;}ExternalInterface.addCallback(loadAndPlayVideo,null,loadAndPlayVideo);/*************************************************************************************************函数解释****************************************************************************************publicstaticaddCallback(methodName:String,instance:Object,method:Function):Boolean将ActionScript方法注册为可从容器调用。成功调用addCallBack()后,容器中的JavaScript或ActiveX代码可以调用在FlashPlayer中注册的函数。可用性:ActionScript1.0;FlashPlayer8参数methodName:String-从JavaScript调用ActionScript函数时可使用的名称。此名称不必与ActionScript方法的实际名称匹配。instance:Object-this在该方法中被解析成的对象。此对象不一定是在其上可找到该方法的对象,您可以指定任何对象(或null)。method:Function-要从JavaScript调用的ActionScript方法。返回true-如果调用成功,则返回Boolean。如果调用由于下列原因而失败,则返回false:实例不可用、遇到了安全限制、没有这种函数对象、发生了递归或类似情况。返回值为false还可能表示包含环境属于调用代码无权访问的安全沙箱。您可以在包含环境的HTML中为allowScriptAccessOBJECT标签或EMBED标签设置一个合适的值,以解决此问题。示例下面的示例将goToMacromedia()函数注册为可使用名称goHome从容器调用。importflash.external.*;varmethodName:String=goHome;varinstance:Object=null;varmethod:Function=goToMacromedia;varwasSuccessful:Boolean=ExternalInterface.addCallback(methodName,instance,method);vartxtField:TextField=this.createTextField(txtField,this.getNextHighestDepth(),0,0,200,50);txtField.border=true;txtField.text=wasSuccessful.toString();functiongoToMacromedia(){txtField.text=();}为了使上一示例能够正常运行,应复制以下代码并将其粘贴到包含HTML页中。此代码依赖OBJECT标签的id属性和EMBED标签的name属性以获得值externalInterfaceExample。由于InternetExplorer和Netscape以不同方式引用movie对象,所以函数thisMovie根据浏览器返回相应的语法。除非服务器上承载HTML页,否则您的浏览器可能会出现安全警告。注意:请避免使用访问插件对象的其它方法(如document.getElementById(pluginName)或document.all.pluginName),因为这些其它方法在所有浏览器上的运行不一致。详细信息参考Flash8.0的addCallback帮助***********************************************************************************************************************************************************************************************/C#中调用Flash的情形:privateAxShockwaveFlashflashPlayer;publicFLVPlayer(){//ErrorhandlingremovedforthesakeofcondensingthecodeflashPlayer.LoadMovie(0,Application.StartupPath+\\player.swf);}fileDialog=newOpenFileDialog();fileDialog.Filter=*.flv|*.flv;fileDialog.Title=SelectaFlashVideofile...;fileDialog.Multiselect=false;fileDialog.RestoreDirectory=true;if(fileDialog.ShowDialog()==DialogResult.OK){flashPlayer.CallFunction(invoke+name=\loadAndPlayVideo\returntype=\xml\argumentsstring+fileDialog.FileName+/string/arguments/invoke);}//如果不用传递参数,且返回值是“123456“的字符串的代码如下:stringstr=flashPlayer.CallFunction(invokename=\loadAndPlayVideo\returntype=\xml\/invoke);MessageBox.Show(str);//显示string123456/string如果返回值是数值123,那么MessageBox.Show(str);//显示number123/number/****************************************************************C#也可以通过axShockwaveFlash.CallFunction(stringrequest)axShockwaveFlash.CallFunction(flash中的方法名,参数,[参数,...]);调用Flash中的方法。具体实现是通过传递XML实现的,具体XML的形式如同:invokename=MethodNamereturntype=xml//MethodName是要调用的Flash内的函数argumentsnumber11/number//传递给MethodName函数一个数值类型的参数stringssss/string//传递给MethodName函数一个字符串类型的参数.../arguments/invokeSinceversion5,AdobeFlash就有了XMLSocket类,它是一种灵活的机制对于发送和获取数据通过TCP/IP,Thisclasshastheoneminordrawbackofrequiringthatalldatabeconvertedtoanull-terminatedstringfortransport。InFlash9,AdobeintroducedtheSocketclass,whichallowsforbinaryortextdataofarbitraryformatting.BothoftheseclassesarequitesuitableforourbidirectionalHIDdemonstrationofaUSBknobwithanLED.***************************************************************************************************/在ActionScript中调用C#函数:在flash中通过ExternalInterface.call()调用c#函数ResizePlayer,并触发c#中的FlashCall事件;ExternalInterface.call(ResizePlayer,videoPlayer.metadata.width,videoPlayer.metadata.height);/************