文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
文本框中光标位置的获得
用VB导入导出你的IE收藏夹
VB应用程序访问SQL Server方法探讨
VB访问SQL Server数据库技术全揭密
自动上网抓数据的机器人
自己的IE——用VB制作浏览器
VB中如何保存Webbrowser中的整个页面..
在VB中该如何控制其它程序的弹出窗口..
保存webbrowser中的HTML内容
破译动网验证码的简单方法
轻松获取QQ密码
VB.NET获取硬盘序列号的方法
WEBBROWSER 技巧一(收藏)
VB自动登陆网络站点详解(二):Inet..
获取webbrowser控件网页的源码
WebBrowser控件说明
关于用VB做更漂亮的窗体的思考
VB中访问存储过程的几种办法
VB6中改变屏幕的分辨率和刷新频率
VB编写一个能显示百分比的自定义进度..
公农历转换VB类
VB.NET窗口渐淡关闭
使用VB实现邮箱自动注册(二):修改..
VB.NET轻松实现任务栏程序
VB.NET启动外部程序
利用vb实现图片上传
VB实现局域网内的文件传输
VB 一个Function传回多个值
在VB中实现多线程
VB 手机号码编码程序


技术教程 -> VB教程 ->  
DIY自己的Flash播放器
来源:转载   人气:877   录入时间:2007-11-8
    请参考网络学院的另一篇文章:《在flash中控制vb 程序》
   
     要说flash动画是时下网上最流行的东东想来不会有人反对的,每当看到优秀作品笔者就急不可待download,但是收集了那么多却发现没有好用的flash播放器来播放。笔者首先想到的是flash5中自带的播放器,可是其功能实在太弱,而且还要安装几十mb的flash5,未免大材小用,难道只能在网页上欣赏吗?于是,我想到自己做一个--这听上去很诱人,复杂吗?别担心,用vb就行,做出来的播放器功能一点也不弱,具有相当水准,你可以自由的选择播放、暂停、重播,还可以单帧逐步播放,来观察作者的每一步设想,甚至可以像看vcd一样看flash文件,随意跳帧。够酷吧!让你充分体验一回作为软件diyer的乐趣。
   
     下面我将详细地阐述整个开发过程。
   
     ::理论分析::
   
     ·如何实现播放flash动画?
   
     flash播放器也属于多媒体播放器的一类,所以应包括完整的播放控制功能:播放、暂停、停止、重播、后退一帧、前进一帧、最后一帧、快退、快进,循环播放和全屏幕播放。由于flash动画是矢量动画,针对此特点还得有缩放和质量调节的功能。
   
     要实现如此多的功能无须自己编程,只要调用系统中的flash播放控件提供的接口,其实flash5中自带的播放器和网上众多的flash播放都是这样做的。
   
     如果你上网能正常浏览有flash动画的网页,那么你的系统中已经有此控件了。若没有,你可以通过“控制面板”-“添加/删除程序”进行安装。选择“windows安装程序”页,在“多媒体”中选择“详细资料”,“macromedia shockwave flash”就是我们需要的,将其前面的复选框选中,再将windows安装光盘放入光驱,点击“确定”即可将控件swflash.ocx安装注册;或者你也可以直接在浏览有flash动画的网页ie提示你下载此控件时自动下载安装。
   
     说到这里你可能认为既然控件很容易得到,又只不过是调用控件提供的接口,没有什么难点。请注意!基于flash控件的开发是没有公开的技术资料可查的,其资料必须以开发商业软件为目的同macromedia签定有关协议后才可能获得,而且是要付费的。因此笔者在开发过程中走了不少弯路,有些属性和方法的使用是在摸索中逐渐搞清楚的,部分接口到目前为止笔者还是不知道怎样使用,在后面的源代码中你也能看得出探索的痕迹。
   
     ·特别问题:如何全屏幕播放?
   
     全屏幕播放是个看似简单,实现起来一点也不容易的功能。在所有的播放控制功能中,全屏幕播放是唯一一个不是由flash控件提供的,因为只有窗口才有全屏的概念,控件则没有,因此它需要播放器自己实现。全屏的要求是窗口充满屏幕,并且无标题条的边框,这就需要在运行时刻动态改变窗口的风格,但我们知道vb开发的程序,没有提供在运行时刻动态更改窗口风格的方法(运行时更改窗口的borderstyle无效,controlbox属性不能在运行时更改),看来惟有借助windows api了。windows在user32.dll中提供了一组对应函数来分别获取和更改窗口的属性--getwindowlong和setwindowlong,它们都可以在vb的api loader中找到:private declare function getwindowlong lib "user32" alias "getwindowlonga" (byval hwnd as long, byval nindex as long) as long;
   private declare function setwindowlong lib "user32" alias "setwindowlonga" (byval hwnd as long, byval nindex as long, byval dwnewlong as long) as long。其中hwnd参数是被操作窗口的句柄;nindex参数告诉函数要操作窗口的什么属性,在本程序中传入gwl_style值,其他参数值可查阅msdn;dwnewlong参数是新的窗口属性值。标准的窗口风格是有标题条和可缩放的边框,对应的窗口风格参数值是ws_caption和ws_thickframe,所以要实现全屏只要将窗口风格属性中的这两个值去掉就达到效果了,要恢复也很简单,重新加上这两个值即可。
   
     了解原理后,下面我们就进行编程实践了!
   
   
   
   
   
     ::编程实践::
   
     打开vb,新建一个标准的exe工程,将工程名称命名为"myflashplayer",在控件箱中添加commondialog、statusbar、slider、shockwaveflash控件。将默认生成的窗口name属性改为"frmmyflashplayer",caption改为"my flashplayer",scalemode改为"3 - pixel",然后依次添加以下控件:
   
     1、12个按钮(commandbutton),name属性分别为"cmdplayswf"、"cmdpauseswf"、"cmdstopswf"、
   "cmdrewindswf"、"cmdstepbackswf"、"cmdstepforwardswf"、"cmdgotoendswf"、
   "cmdfastbackswf"、"cmdfastforwardswf"、"cmdzoominswf"、"cmdzoomoutswf"、
   "cmdzoomnoswf",caption属性分别为“播放”、“暂停”、“停止”、“重播”、“后退”、“前进”、“末帧”、“快退”、“快进”、“放大”、“缩小”、“正常”。
   
     2、1个划动条(slider),name属性为sliderswf,max属性为"100"(表示100%),tickstyle属性为"3 - sldnoticks"。1个状态栏(statusbar),双击其属性中的“(自定义)”,在弹出的属性页的窗格栏中,插入2个窗格,并将2个窗格的对齐方式设置为"1 - sbrcenter"。
   
     3、1个定时器(timer),name属性为timerswf,enabled属性为"false",interval属性为"1000"。1个通用对话框(commondialog),name属性为"opendialogswf",dialogtitle属性为“打开flash动画文件”,filter属性为“flash动画文件(*.swf)|*.swf|所有文件(*.*)|*.*”,filterindex属性为"1"。
   
     4、1个shockwaveflash控件,name属性为myshockwaveflash,点击鼠标右键弹出快捷菜单,选择“置前”,使其在所有控件的最上面,全屏幕播放需要此设置,在后面源代码中笔者将说明其用途。
   
     5、打开菜单编辑器,添加如下菜单:“文件(&f)”(mnufileswf)、“打开(&o)”(ctrl+o)(mnuopenswf)、“退出(&x)”(mnuexitswf)、“查看(&v)”(mnuviewswf)、“质量(&q)”(mnuqualityswf)、“高(&h)”(复选)(mnuqualityhigh)、“中(&m)”(mnuqualitymedium)、“低(&l)”(mnuqualitylow)、“循环播放(&l)”(复选)(mnuloopswf)、“快捷菜单(&m)”(复选)(mnumenuswf)、“全屏幕播放(&f)”(f11)(mnufullscreenswf)。其中“文件”包括“打开”、“退出”,“查看”包括“质量”、“循环播放”、“快捷菜单”、“全屏幕播放”,“质量”又包括“高”、“中”、“低”。
   
   接下来我们输入以下代码:
   
   option explicit
   
   private declare function setwindowlong lib "user32" alias "setwindowlonga"
   (byval hwnd as long, byval nindex as long, byval dwnewlong as long) as long
   private declare function getwindowlong lib "user32" alias "getwindowlonga"
   (byval hwnd as long, byval nindex as long) as long
   private const gwl_style = (-16)
   ' 窗口风格参数值
   private const ws_caption = &hc00000
   private const ws_thickframe = &h40000
   
   private sub cmdfastbackswf_click()
   ' 向后5%
   if myshockwaveflash.framenum >= 0 then
   myshockwaveflash.gotoframe (
   (sliderswf.value - sliderswf.largechange) * 0.01 * (myshockwaveflash.totalframes - 1))
   end if
   end sub
   
   private sub cmdfastforwardswf_click()
   ' 向前5%
   if myshockwaveflash.framenum >= 0 then
   myshockwaveflash.gotoframe (
   (sliderswf.value + sliderswf.largechange) * 0.01 * (myshockwaveflash.totalframes - 1))
   end if
   end sub
   
   private sub cmdgotoendswf_click()
   ' 到最后一帧
   if myshockwaveflash.framenum >= 0 then
   myshockwaveflash.gotoframe (myshockwaveflash.totalframes - 1)
   end if
   end sub
   
   private sub cmdpauseswf_click()
   ' 暂停播放
   ' shockwaveflash控件中没有多媒体播放器中典型的名为“pause”的功能
   ' 只有两个看不出区别的功能:stopplay和stop,都是用来暂停播放的
   
   myshockwaveflash.stopplay
   end sub
   
   private sub cmdplayswf_click()
   ' 播放
   myshockwaveflash.play
   end sub
   
   private sub cmdrewindswf_click()
   ' 返回到第一帧,自动开始播放
   myshockwaveflash.rewind
   myshockwaveflash.play
   end sub
   
   private sub cmdstepbackswf_click()
   ' 后退一帧
   myshockwaveflash.back
   end sub
   
   private sub cmdstepforwardswf_click()
   ' 前进一帧
   myshockwaveflash.forward
   end sub
   
   
   private sub cmdstopswf_click()
   ' 停止
   ' 一般多媒体播放器停止的行为是停止播放并返回到第一帧
   ' 但shockwaveflash控件中没有这样的功能
   ' 所以只能以“返回到第一帧”和“暂停播放”两个功能组合实现
   
   myshockwaveflash.rewind
   myshockwaveflash.stopplay
   end sub
   
   private sub cmdzoominswf_click()
   ' 放大一倍,以原先为50%
   myshockwaveflash.zoom (50)
   end sub
   
   private sub cmdzoomnoswf_click()
   ' 正常大小
   myshockwaveflash.zoom (0)
   end sub
   
   private sub cmdzoomoutswf_click()
   ' 缩小一倍,以原先为200%
   myshockwaveflash.zoom (200)
   end sub
   
   private sub form_load()
   ' 设置打开文件对话框的标志为:
   ' 文件名和路径都必须有效,并且不显示“以只读方式打开(r)”的复选项
   opendialogswf.flags = cdlofnfilemustexist or cdlofnpathmustexist or cdlofnhidereadonly
   end sub
   
   private sub form_resize()
   if me.windowstate <> vbminimized then
   ' 当窗口不是最小化时,根据窗口大小调整各控件的位置和大小
   ' 否则计算高度和宽度时会出现非正数而出错
   if me.scaleheight > (cmdplayswf.height + statusbarswf.height + sliderswf.height) then
   myshockwaveflash.move 0, cmdplayswf.height + 8,
   me.scalewidth, me.scaleheight - cmdplayswf.height - statusbarswf.height -sliderswf.height - 16
   end if
   
   sliderswf.top = me.scaleheight - statusbarswf.height - sliderswf.height
   sliderswf.width = me.scalewidth
   
   statusbarswf.panels(1).minwidth = me.scalewidth * 0.6
   statusbarswf.panels(2).minwidth = me.scalewidth * 0.2
   statusbarswf.panels(3).minwidth = me.scalewidth * 0.2
   end if
   end sub
   
   private sub mnuclose_click()
   timerswf.enabled = false
   myshockwaveflash.movie = "http://" ' 只有此参数才能关闭当前动画,如果传入vbnullstring会出错
   statusbarswf.panels(1).text = vbnullstring
   statusbarswf.panels(1).tooltiptext = vbnullstring
   statusbarswf.panels(2).text = vbnullstring
   statusbarswf.panels(3).text = vbnullstring
   sliderswf.value = 0
   end sub
   
   private sub mnuexitswf_click()
   unload me
   end sub
   
   
   private sub mnufullscreenswf_click()
   ' 全屏幕播放,隐藏播放控制和进度显示
   dim returnvalue as long, windowstyle as long
   mnufullscreenswf.checked = not mnufullscreenswf.checked
   if mnufullscreenswf.checked then
   ' 更改窗口风格为无边框和无标题条,并且充满屏幕
   windowstyle = getwindowlong(me.hwnd, gwl_style)
   returnvalue = setwindowlong(me.hwnd, gwl_style, windowstyle - ws_caption - ws_thickframe)
   
   me.windowstate = vbnormal
   me.move 0, 0, screen.width, screen.height
   
   ' 因为shockwaveflash在所有控件的最上面
   ' 所以无须隐藏其他控件就可充满窗口
   myshockwaveflash.move 0, 0, me.scalewidth, me.scaleheight
   else
   ' 恢复窗口风格为正常式样,并且还原为默认大小
   windowstyle = getwindowlong(me.hwnd, gwl_style)
   returnvalue = setwindowlong(me.hwnd, gwl_style, windowstyle or ws_caption or ws_thickframe)
   
   me.move 0, 0, 488 * screen.twipsperpixelx, 446 * screen.twipsperpixely
   me.move (screen.width - me.width) \ 2, (screen.height - me.height) \ 2
   end if
   end sub
   
   private sub mnuloopswf_click()
   ' 设置shockwaveflash是否循环播放
   mnuloopswf.checked = not mnuloopswf.checked
   myshockwaveflash.loop = mnuloopswf.checked
   end sub
   
   private sub mnumenuswf_click()
   ' 设置shockwaveflash快捷菜单是否可用
   mnumenuswf.checked = not mnumenuswf.checked
   myshockwaveflash.menu = mnumenuswf.checked
   end sub
   
   private sub mnuopenswf_click()
   ' 打开flash动画文件
   on error goto erroropenswf
   
   opendialogswf.showopen
   if opendialogswf.filename <> vbnullstring then
   statusbarswf.panels(1).text = opendialogswf.filename
   statusbarswf.panels(1).tooltiptext = opendialogswf.filename
   myshockwaveflash.movie = opendialogswf.filename
   timerswf.enabled = true ' 开始显示播放进度
   statusbarswf.panels(2).text = format$(myshockwaveflash.totalframes, "共#帧")
   end if
   exit sub
   
   
   
   erroropenswf:
   ' 打开flash动画文件中有个bug:
   ' 如果打开了一个非flash动画格式或是损坏的flash动画,shockwaveflash控件将产生异常错误
   ' 但之后就无法再打开任何完好的flash动画了,即无法给movie属性赋予任何有效值了,只有关闭程序再重新运行
   ' 我猜测可能是shockwaveflash控件的问题
   
   msgbox "不是有效的flash动画,或flash动画已损坏,程序将被关闭!", vbcritical
   unload me
   end sub
   
   private sub mnuqualityhigh_click()
   ' 高质量
   myshockwaveflash.quality2 = "high" '等同于:myshockwaveflash.quality = 1
   mnuqualityhigh.checked = true
   mnuqualitymedium.checked = false
   mnuqualitylow.checked = false
   end sub
   
   private sub mnuqualitylow_click()
   ' 低质量
   myshockwaveflash.quality2 = "low" '等同于:myshockwaveflash.quality = 0
   mnuqualityhigh.checked = false
   mnuqualitymedium.checked = false
   mnuqualitylow.checked = true
   end sub
   
   private sub mnuqualitymedium_click()
   ' 中质量
   myshockwaveflash.quality2 = "medium" '无对应数字值,只能用字符串赋值
   mnuqualityhigh.checked = false
   mnuqualitymedium.checked = true
   mnuqualitylow.checked = false
   end sub
   
   private sub mnuwebopen_click()
   dim swfurl as string
   swfurl = inputbox("输入动画链接地址")
   if swfurl <> vbnullstring then
   myshockwaveflash.movie = swfurl
   end if
   end sub
   
   private sub sliderswf_scroll()
   if myshockwaveflash.framenum >= 0 then
   ' 根据划动条的值为百分比跳转到动画播放进度
   myshockwaveflash.gotoframe (sliderswf.value * 0.01 * (myshockwaveflash.totalframes - 1))
   else
   sliderswf.value = 0
   end if
   end sub
   
   private sub timerswf_timer()
   ' shockwaveflash控件没有播放进度的事件
   ' 因此使用定时器显示当前动画的播放信息
   sliderswf.value = myshockwaveflash.framenum / (myshockwaveflash.totalframes - 1) * 100
   sliderswf.tooltiptext = cstr(sliderswf.value) + "%"
   statusbarswf.panels(3).text = format$(myshockwaveflash.framenum + 1, "第0帧")
   end sub
   
   
     ::结束语::
   
     打开一个flash动画,按一下播放控制按钮,拖动一下划动条,再试一下全屏幕播放
     真的很酷!至此一个diy的flash播放器制作成功了,整个软件的源代码不算多,但功能却要比flash5自带的播放器强大无数倍哦:)。网上总有人问如何成为高手,其实像这样亲手做一个功能完整的小软件就能在开发过程中逐渐提高水平。
   
     本程序的系统兼容性极佳,虽然笔者是基于flash5播放控件在win98se+vb6中调试通过的,理论上只要windows中安装了flash5播放控件软件就能运行,所以我相信从win95到winxp都是能正常运行的。
   
     如果你是diy发烧一族兼高手,还可以美化一下界面,将窗口变成你喜欢的形状,并在此程序基础上增加更强大的功能:播放exe格式的flash动画、播放列表、音量控制、截取某一帧的图片等,那么恭喜恭喜,你做出了世界上最完美的flash播放器!!!
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987