DIY自己的Flash播放器 | 出处:PConline |
[02-3-5 15:57] | 作者:cyberian |
|
·特别问题:如何全屏幕播放?
全屏幕播放是个看似简单,实现起来一点也不容易的功能。在所有的播放控制功能中,全屏幕播放是唯一一个不是由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)。其中“文件”包括“打开”、“退出”,“查看”包括“质量”、“循环播放”、“快捷菜单”、“全屏幕播放”,“质量”又包括“高”、“中”、“低”。
好了,界面设计完成,效果如图1。
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
::结束语::
完成后编译运行,运行效果如图2。
联系客服