使用函数播放AVI文件
除了可以使用控件直接播放avi文件,用户还可以使用系统提供的MCIWndCreate函数来播放avi文件。
MCIWndCreate函数语法如下:
HWND MCIWndCreate(HWND hwndParent,HINSTANCE hInstance,DWORD dwStyle, LPSTR szFile );
参数说明:
hwndParent:表示媒体播放窗口的父窗口。
hInstance:表示关联MCIWnd窗口的实例句柄。
dwStyle:表示窗口风格,其可选值如表1所示。
表1 窗口风格
|
值
|
描述
|
|
MCIWNDF_NOAUTOSIZEWINDOW
|
当图像大小改变时,MCI窗口不改变
|
|
MCIWNDF_NOAUTOSIZEMOVIE
|
当MCI窗口改变时不改变目标区域的大小
|
|
MCIWNDF_NOERRORDLG
|
阻止显示错误对话框
|
|
MCIWNDF_NOMENU
|
隐藏菜单按钮
|
|
MCIWNDF_NOOPEN
|
隐藏菜单中的打开、关闭命令
|
|
MCIWNDF_NOPLAYBAR
|
隐藏工具条,阻止用户对其进行访问
|
|
MCIWNDF_NOTIFYANSI
|
当用ASCI字符串代替UNICODE字符串时,通知父窗口设备模式的改变
|
|
MCIWNDF_NOTIFYMODE
|
当设备操作模式改变时,MCI窗口以MCIWNDM_NOTIFYMODE消息通知父窗口
|
|
MCIWNDF_NOTIFYPOS
|
在录制或回放时,如果位置发生改变以MCIWNDM_NOTIFYPOS消息通知父窗口
|
|
MCIWNDF_NOTIFYMEDIA
|
当新的设备被使用或者数据文件被打开或关闭时,以MCIWNDM_NOTIFYMEDIA消息通知父窗口
|
|
MCIWNDF_NOTIFYSIZE
|
当MCI窗口大小改变时通知父窗口
|
|
MCIWNDF_NOTIFYERROR
|
当一个MCI错误发生时通知父窗口
|
|
MCIWNDF_NOTIFYALL
|
是所有的MCI窗口通知风格被使用
|
|
MCIWNDF_RECORD
|
添加一个录音按钮到工具栏中,并添加一个新建文件命令到菜单中
|
|
MCIWNDF_SHOWALL
|
使MCIWNDF_SHOW风格应用于所有的MCI窗口中
|
|
MCIWNDF_SHOWMODE
|
在MCI窗口标题栏中显示媒体设备的当前模式
|
|
MCIWNDF_SHOWNAME
|
在MCI窗口标题栏中显示打开的MCI设备的名称或者数据文件的名称
|
|
MCIWNDF_SHOWPOS
|
在MCI窗口标题栏中显示当期设备内容的位置
|
szFile:表示播放的avi文件名称。
下面通过一个示例介绍如何使用MCIWndCreate函数播放avi文件。
例如,使用MCIWndCreate函数播放avi文件
(1)创建一个基于对话框的应用程序,工程名称为“PlayAvi”。
(2)引用vfw.h头文件并链接Vfw32.lib库文件。
#include "Vfw.h" //引用头文件
#pragma comment (lib,"Vfw32.lib") //链接库文件
(3)在对话框类中定义一个MCI窗口句柄。
HWND m_hAviWnd; //定义窗口句柄
(4)向对话框中添加OnNotifyMode消息方法,当设备的模式发生改变时调用该方法。
LRESULT CPlayAviDlg::OnNotifyMode(WPARAM wparam, LPARAM lparam)
{
long code = (long)lparam; //获取通知代码
if (code == MCI_MODE_STOP) //判断avi文件是否播放完毕
{
MCIWndClose(m_hAviWnd); //关闭MCI窗口
}
return 0;
}
(5)在对话框的消息映射部分添加消息映射宏。
ON_MESSAGE(MCIWNDM_NOTIFYMODE,OnNotifyMode)
(6)处理“OK”按钮的单击事件,弹出文件打开对话框让用户选择一个avi文件,并进行播放。
void CPlayAviDlg::OnOK()
{
CFileDialog flDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"AVI文件|*.avi||",this); //定义文件打开对话框
if (flDlg.DoModal()==IDOK) //判断用户是否单击OK按钮
{
MCIWndDestroy(m_hAviWnd); //先释放窗口
m_hAviWnd = MCIWndCreate(m_hWnd,NULL,MCIWNDF_SHOWMODE|MCIWNDF_NOTI
FYMODE,flDlg.GetPathName()); //创建MCI窗口
MCIWndPlay(m_hAviWnd); //播放文件
}
}
提示:在调用MCIWndCreate函数前,如果之前已经创建了一个视频窗口,则首先需要调用MCIWndDestroy函数释放视频窗口。
(7)在对话框关闭时释放MCI窗口。
void CPlayAviDlg::OnCancel()
{
MCIWndDestroy(m_hAviWnd); //释放MCI窗口
CDialog::OnCancel();
}
(8)运行程序,效果如图1所示。
.jpg)
图1 播放AVI文件