使用Flash和CWinForm配合打造界面漂亮的应用程序.docx
《使用Flash和CWinForm配合打造界面漂亮的应用程序.docx》由会员分享,可在线阅读,更多相关《使用Flash和CWinForm配合打造界面漂亮的应用程序.docx(14页珍藏版)》请在冰点文库上搜索。
使用Flash和CWinForm配合打造界面漂亮的应用程序
使用Flash和C#WinForm配合打造界面漂亮的应用程序
由于之前一阵公司一个项目提出的需求,自己也想进行这方面的尝试,我对如何使用Flash来做WinForm程序的界面产生了兴趣,于是学习了一些资料,摘要于此。
要在WinForm中使用Flash,通常需要用到ShockwaveFlashObject这个COM组件。
(/fscommand.asp)
(/FlashDBInteract.asp)
具体步骤如下:
首先添加对COM组件ShockwaveFlashObject的引用,将该组件拖到窗体上之后,可以设置如下关键属性:
Movie:
Flash的存放地址
EmbedMovie:
是否嵌入到程序的资源中。
接下来你可以设置其他一些属性,使得Flash的窗口最大化,隐藏掉其宿主程序的C#WinForm窗体。
在Flash的ActionScript中,可以通过FSCommand函数与hostingapp通信,该函数有两个参数,分别是:
command:
命令名称
parameters:
参数
例子:
on(press){
fscommand("Circule", "Green");
}
在C#中,处理Flash对象的FSCommand事件即可。
如果该事件处理函数的EventArgs为e,则有如下对应关系:
mand->Flash中调用FSCommand时的command参数;
e.args->Flash中调用FSCommand时的arguments参数。
在C#中往Flash传递数值用SetVariable方法:
axShockwaveFlash1.SetVariable("variablename", "valueasstring");
对应的,有一个GetVariable方法可以获得Flash中的变量值。
FSCommand的参数只能传递一个,所以其功能存在一定的局限性。
在你需要传递多个参数的时候,则需要在调用方用字符串拼接各个参数值,然后在被调用方重新解开。
这种办法使得复杂的传值显得很丑陋。
不过,除了FSCommand外,我们还有另一种办法和Flash通信,就是使用FlashPlayer8ExternalAPI.
(/media/flashexternalapi.asp)
使用ExternalAPI,可以实现ActionScript和C#的双向调用。
其好处就在于每次调用时的参数和返回值都通过一个XML文档来传递,这样就比FSCommand功能完善了很多。
当然在C#中,我们也需要声明一下外部函数实现的对应关系。
c#调用ActionScript中的函数
代码片段:
FlashActionScript中声明提供给hostingapplication调用的回调函数:
import ;
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="";
getURL("","_self");
}
为了使上一示例能够正常运行,应复制以下代码并将其粘贴到包含HTML页中。
此代码依赖OBJECT标签的id属性和EMBED标签的name属性以获得值externalInterfaceExample。
由于InternetExplorer和Netscape以不同方式引用movie对象,所以函数thisMovie根据浏览器返回相应的语法。
除非服务器上承载HTML页,否则您的浏览器可能会出现安全警告。
注意:
请避免使用访问插件对象的其它方法(如document.getElementById("pluginName")或,因为这些其它方法在所有浏览器上的运行不一致。
详细信息参考Flash8.0的addCallback帮助
****************************************************************************************
*******************************************************************************************************/
C#中调用Flash的情形:
privateAxShockwaveFlashflashPlayer;
publicFLVPlayer()
{
//Errorhandlingremovedforthesakeofcondensingthecode
flashPlayer.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(""name=\"loadAndPlayVideo\"returntype=\"xml\">
"+fileDialog.FileName+
"
");
}
//如果不用传递参数,且返回值是“123456“的字符串的代码如下:
stringstr=flashPlayer.CallFunction("");
MessageBox.Show(str);//显示123456
如果返回值是数值123,那么MessageBox.Show(str);//显示123
/****************************************************************
C#也可以通过
axShockwaveFlash.CallFunction(stringrequest)
axShockwaveFlash.CallFunction(flash中的方法名,参数,[参数,...]);
调用Flash中的方法。
具体实现是通过传递XML实现的,具体XML的形式如同:
//MethodName是要调用的Flash内的函数
11//传递给MethodName函数一个数值类型的参数
ssss//传递给MethodName函数一个字符串类型的参数
...
Sinceversion5,AdobeFlash就有了XMLSocket类,它是一种灵活的机制对于发送和获取数据通过TCP/IP,Thisclasshastheoneminordrawbackofrequiringthatalldatabeconvertedtoanull-terminatedstringfortransport。
InFlash9,AdobeintroducedtheSocketclass,whichallowsforbinaryortextdataofarbitraryformatting.BothoftheseclassesarequitesuitableforourbidirectionalHIDdemonstrationofaUSBknobwithanLED.
***************************************************************************************************/
在ActionScript中调用C#函数:
在flash中通过ExternalInterface.call()调用c#函数ResizePlayer,并触发c#中的FlashCall事件;
ExternalInterface.call("ResizePlayer",
, ;
/***********************************
publicstaticfunctioncall(functionName:
String,...arguments):
*
调用由FlashPlayer容器公开的函数,不传递参数或传递多个参数。
如果所需的函数不可用,则调用返回null;否则,将返回由该函数提供的值。
不允许使用递归;递归调用会生成null响应。
如果容器是HTML页,则此方法在