MFC中使用FLASH相关
一、准备工作 第一步:下载并安装Adobe Flash Player。 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约为2.66M),并安装。对于Windows 32位系统,其默认安装目录为:C:WINDOWSsystem32MacromedFlash;对于64位系统,为:C:WindowsSysWOW64MacromedFlash。 ????? Flash控件的大版本号用数字表示,如9,10,11等,小版本号用小写字母表示,如a,b,c,d,e。如我安装的版本为:Flash10l.ocx。 第二步:通过regsvr32.exe注册flash控件?Flash10l.ocx。 ???????从开始菜单中打开运行对话框,并输入: regsvr32 C:WindowsSysWOW64MacromedFlashFlash10l.ocx?注册该控件(注册之后就可以在项目中进行控件添加了),如果注册成功,有如下提示: ??????注销控件的命令行为 regsvr32 /u C:WindowsSysWOW64MacromedFlashFlash10l.ocx。 二、新建MFC项目,添加Flash控件 第一步:建立基于对话框的MFC程序。 打开Visual Studio 2010,新建项目,选择“MFC应用程序”,并将其命名为MFCFlash。 在接下来的选型设置中,选择应用程序类型为“基于对话框”,其他可按默认设置。项目建成后,程序默认添加了MFCFlash和MFCFlashDlg的头文件和实现文件,截图如下: 第二步:添加Shockwave Flash Object类。 VC++ 6.0中,可以使用ClassWizard添加ActiveX控件,而VS2005以后的版本没有。如果要添加ActiveX对应的类,可以先在解决方案管理器中选中项目后在菜单中点“项目”→“添加类”→“ActiveX控件中的MFC类”,打开“从ActiveX控件添加类向导”对话框。选择从“文件”添加类,找到Flash控件的安装位置,即可添加Shockwave Flash控件,接口选择“IShockwaveFlash”,以生成CShockwaveFlash类(类的名称可以修改)。插入后,VC会自动把这个类加入工程里面。 第三步:添加Shockwave Flash Object控件。 在资源视图里找到“Dialog”,并选择其中的IDD_MFCFLASH_DIALOG,在其上点右键,选择“插入ActiveX控件”,从弹出的列表中选择“Shockwave Flash Object”。 使用BUTTON、EDIT等其它Windows控件一样,我们可以使用这个类的成员函数来操纵这个对象,来进行Flash动画的控制以及和自己的程序进行交互等操作了。在Flash控件上点右键,然后选择“添加变量”,设定“变量名”为:m_FlashPlayer。可再次在Flash控件上点右键,然后选择“属性”,将其ID改为IDC_SHOCKWAVEFLASH。 第四步:使用成员函数LoadMovie和Play来导入并播放动画。 在MFCFlashDlg.cpp文件中,找到CMFCFlashDlg::OnInitDialog()函数,在“return TRUE”之前添加代码: ??? ? CString str = _T("E:VSFlashmediatest.swf"); ??? ? m_FlashPlayer.LoadMovie (0,str); ??? ? m_FlashPlayer. Play (); 其中m_FlashPlayer.LoadMovie(0,str)用来将动画导入程序中,str为要播放的flash路径,要用绝对路径(注意路径用双斜杠“”隔开);?m_FlashPlayer. Play ()开始播放动画。 相对路径转绝对路径: wchar_t?szPath[MAX_PATH]; ??? memset(szPath,?sizeof(CHAR)*MAX_PATH); ??? GetCurrentDirectory(MAX_PATH,szPath); ??? StrCat(szPath,_T("风扇.swf")); ? 现在运行程序,就可以看到flash嵌入到程序里面了。还有几个常用的函数可以用来控制动画的播放,如GotoFrame(long FrameNum)可以转到FrameNum侦播放(侦数从0开始),StopPlay()可以停止播放。。。,还有很多,可以自己试试。下图是我做的一个飞行仪表,界面比较丑陋,凑合看吧^_^ 三、实现MFC与Flash的通信 1、Flash通过FSCommand消息调用MFC 第一步:添加消息处理函数。Flash控件上点右键,然后选择“添加事件处理程序”,在类列表选择“CMFCFlashDlg”,消息类型选择“FSCommand”,则函数处理程序名称自动为“FSCommandShockwaveflash”。它的形式大概是这样子的: void CMFCFlashDlg::OnFSCommandShockwaveflash(LPCTSTR command,LPCTSTR args) ;函数有两个参数,就是flash的Action Script中FSCommand语句中的两个参数。其实并不一定两个参数都用到,flash脚本中可以就使用一个参数,这样这边的函数就只要对第一个参数进行处理就行了。 第二步:编写消息处理代码。 在刚添加的FSCommand消息处理函数中,对两个参数进行处理。其实就是做字符串比较的操作,根据是什么字符串来判断用户进行了什么操作。大概就是这样子的: void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command,LPCTSTR args) 这只是最简单的处理形式,当然你可以在flash中发送复杂的字符串,在这边就要进行更多的处理了。 2、MFC通过CallFunction函数调用Flash 第一步:Flash中ExternalInterface.addCallback用处理。 FLASH中,要用ExternalInterface.addCallback把能被外部调用的函数注册一下,例如:?ExternalInterface.addCallback("setAlt",setAlt); function setAlt (para:String = "3150") { ?????? alt.text = para; //alt为swf文件中的一个动态文本 } 第二步:MFC中使用CallFunction函数传入参数。 想让MFC主动往flash传内容并且让flash响应,用控件的CallFunction方法。在MFC中,调用CallFunction方法,传入一个比较复杂的字符串,描述了要调用的函数的名称、参数等等,以XML的形式呈现。详情参考FLASH帮助的“外部?API?的?XML?格式”一文。此处CallFunction传递的参数为XML格式,如下: ??? CString temp = _T("<invoke name="setAlt" returntype="xml"> ??????????????????? ????? <arguments><string>3500FT</string></arguments> ??????????????????? ?? </invoke>"); ??? m_FlashPlayer.CallFunction(temp); 注意,<arguments>必须是完整的一行,具体为什么我也不太清楚。再次运行程序,可以发现ALT的值已经由3280FT变成了3500FT。
? shockwave flash object控件的相应类是CShockwaveFlash类,该类的常用函数: Play()???播放动画?????????? StopPlay()??停止动画???????? IsPlaying():动画是否正在播放(true,false)? GotoFrame(frame_number)跳转到某帧(frame_number+1)??????????????????? TotalFrames()?获取动画总帧数??????????????? CurrentFrame()回传当前动画所在帧数-1?? Rewind()??使动画返回第一帧?????????????????? SetZoomRect(left,top,right,buttom)放大指定区域? Zoom(percent)?改变动画大小???????????????? Pan(x_position,y_position,unit)??使动画在x,y方向上平移? PercentLoaded()返回动画被载入的百分比(0-100)? LoadMovie(level_number,path)?加载动画? TGotoFrame(movie_clip,frame_number)?? movie_clip跳转到指定帧数?? TCurrentLabel(movie_clip)?回传movie_clip当前标签? TPlay(movie_clip)??播放movie_clip??????????? TStopPlay(movie_clip)??停止movie_clip的播放? GetVariable(variable_name)???获取变量???? SetVariable(variable_name,value)??变量赋值? TCallFrame(movie_clip,frame_number)? call指定帧上的action? TCallLabel(movie_clip,label)? call指定标签上的action TGetProperty(movie_clip,property)??获取movie_clip的指定属性? TSetProperty(movie_clip,property,number)?????设置movie_clip的指定属性 MFC中CShockwaveFlash控件相关说明 MFC中播放Flash使用的ActiceX控件Shockwave Flash Object,其对应的类为CShockwaveFlash。下面给出该控件的常用属性和方法说明: ================================== ++++++++++++++++++++++++ 语法:BackgroundColor?As?Long 语法:Base?As?String? 语法:DeviceFont?As?Boolean? 语法:Loop?As?Boolean? 语法:Menu?As?Boolean? 语法:Movie?As?String? 语法:Playing?As?Boolean? 语法:Quality?As?Long? 语法:Quality2?As?String? 语法:ReadyState?As?Long? 语法:Scale?As?String? 语法:ScaleMode?As?Long? 语法:TotalFrames?As?Long? 语法:WMode?As?String? StopPlay()??????????????????????????????????????????????? //?停止动画 IsPlaying()??????????????????????????????????????????????? //?动画是否正在播放(true,宋体"> GotoFrame(frame_number)???????????????????? //?跳转到某帧(frame_number+1)???????????????????????? CurrentFrame()??????????????????????????????????????? //?回传当前动画所在帧数-1?? Rewind()?????????????????????????????????????????????????? //?使动画返回第一帧?????????????????? SetZoomRect(left,buttom)?????????? //?放大指定区域? Zoom(percent)????????????????????????????????????????? // ?改变动画大小???????????????? Pan(x_position,unit)?????????????????//?使动画在x,宋体"> PercentLoaded()??????????????????????????????????????//返回动画被载入的百分比(0-100)? 加载动画? GetVariable(variable_name)???????????????????? //?获取变量???? SetVariable(variable_name,value)????????????//变量赋值? TotalFrames()????????????????????????????????????????? ?//?获取动画总帧数??????????? TPlay(movie_clip)????????????????????????????????????? //?播放movie_clip??????????? TStopPlay(movie_clip)???????????????????????????????//停止movie_clip的播放? 跳转到指定帧数? TGotoLabel(muvie_clip,label_name)?? ????? // movie_clip跳转到指定标签? TCurrentFrame(movie_clip)?????????????????????? //?回传movie_clip当前帧-1? TCurrentLabel(movie_clip)??????????????????????? //?回传movie_clip当前标签? 指定帧上的action? 指定标签上的action 获取movie_clip的指定属性? 设置movie_clip的指定属性 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |