教学材料《Visual C++程序》-第7章_第1页
教学材料《Visual C++程序》-第7章_第2页
教学材料《Visual C++程序》-第7章_第3页
教学材料《Visual C++程序》-第7章_第4页
教学材料《Visual C++程序》-第7章_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7.1使用MCI播放WAVE文件的程序实例

先举一个简单的例子,了解一下多媒体应用程序的编制过程和实现效果。[例7.1]声音播放1.新建项目(1)创建一个基于对话框的应用程序,名为播放声音。(2)删除原有的“取消”按钮,把“确定”按钮的标题改为“退出”。(3)添加一个按钮,其ID标识符为IDC_PLAY,标题为“播放”。调整对话框大小和布局,如图7.1所示。下一页返回7.1使用MCI播放WAVE文件的程序实例2.为程序添加多媒体支持使用VisualC++编写多媒体程序时必须向项目中添加多媒体支持。步骤如下:(1)选择Project->Setting命令打开ProjectSetting对话框,切换到Link选项卡,在Object/Librarymodules文本框中输入winmm.lib,如图7.2所示,单击OK按钮退出。(2)在“播放声音Dlg.h”文件的前面输入#include"MMSystem.h"上一页下一页返回7.1使用MCI播放WAVE文件的程序实例3.添加成员变量在CMyDlg类(播放声音Dlg.h)中添加成员变量:MCIDEVICEIDm_MCIDeviceID;4.将一个声音文件如:mail.wav复制到此项目文件夹中。5.在CMyDlg类的OnInitDialog()成员函数中添加以下代码(可以把其他语句全部注释掉)。BOOLCMyDlg::OnInitDialog(){ CDialog::OnInitDialog();MCI_OPEN_PARMSmciOpenParms;//打开MCI设备

mciOpenParms.lpstrDeviceType="waveaudio";//MCI设备名mciOpenParms.lpstrElementName="mail.wav";//声音文件,此处写你复制到文件夹下的//声音文件名上一页下一页返回7.1使用MCI播放WAVE文件的程序实例mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciOpenParms); m_MCIDeviceID=mciOpenParms.wDeviceID; returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}说明:

mail.wav是一个WAV声音文件,第4步时已经复制到此项目文件中。程序首先打开了MCI设备,并把设备标识赋给了类的成员变量m_MCIDeviceID。注意声音文件名不要带扩展名.wav。上一页下一页返回7.1使用MCI播放WAVE文件的程序实例6.播放声音文件用ClassWizard(IDC_PLAY)为播放按钮,在CMyDlg类添加鼠标单击的消息映射函数,并添加如下代码:voidCMyDlg::OnPlay(){ //添加控件通知消息处理代码

MCI_PLAY_PARMSmciPlayParms; mciPlayParms.dwFrom=0;//从文件开始处开始播放

mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&mciPlayParms);}上一页下一页返回7.1使用MCI播放WAVE文件的程序实例7.在程序退出时停止播放并关闭MCI设备用ClassWizard为CMyDlg类添加WM_DESTROY消息,该消息映射函数能使程序退出时停止声音文件的播放并关闭MCI设备。voidCMyDlg::OnDestroy(){ CDialog::OnDestroy(); mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//停止播放

mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL);//关闭MCI设备}上一页下一页返回7.1使用MCI播放WAVE文件的程序实例8.编译并运行程序在单击“播放”按钮时,程序将播放声音;当单击“退出”按钮或单击窗口的关闭按钮时,声音播放会立即停止。上一页返回7.2MCI

媒体控制接口(MediaControlInterface,MCI)为Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。对于程序员来说,可以把MCI理解为设备面板上的一排按钮,通过选择不同的按键(发送不同的MCI命令)就可以让设备完成各种功能,而不必关心设备内部实现。例如,对于play按键,视盘机和CD机有不同的反应(一个是播放视频,一个是播放音频),而对用户来说只需要按同一按钮。利用MCI控制多媒体设备分为打开、使用和关闭设备三个过程。下一页返回7.2MCI7.2.1MFC设备类型设备类型是指响应一组共用命令的一类MCI设备。表7.1列出了MFC设备类型。7.2.2MCI命令与函数应用程序通过MCI设备发送命令来控制MCI设备。1.MCI命令

MCI发送命令有两种方法,一种是调用MCI函数mciSendString(),向MCI发送命令字符串,另一种是调用MCI函数mciSendCommand()函数,向MCI发送命令消息,如表7.2所示。上一页下一页返回7.2MCI2.MCI函数所有的MCI函数名都是以mci为前缀,函数原型在MMSYSTEM.H中声明。主要的MCI函数如表7.3所示。3.高级音频函数

Windows提供了3个播放声音的高级音频函数,它们是MessageBeep()、PlaySound()和sndPlaySound()。这3个函数可以满足播放波形声音的一般需要,但它们播放的WAVE文件(波形声音文件)的大小不能超过100KB,如果要播放较大的WAVE文件,则应该使用MCI(媒体控制接口)。上一页下一页返回7.2MCI(1)MessageBeep()函数该函数主要用来播放系统报警声音。系统报警声音是由用户在控制面板中的声音(Sounds)程序中定义的,或者在WIN.INI的sounds段中指定。该函数的原型如下。

BOOLMessageBeep(UINTuType);

参数:uType说明了声音的类型,如表7.4所示。若函数调用成功则返回TRUE。

MessageBeep()只能用来播放少数定义的声音,如果程序需要播放波形音频文件(*.WAV文件)或音频资源,就需要使用PlaySound()或sndPlaySound()函数。上一页下一页返回7.2MCI(2)PlaySound()函数

PlaySound()函数的函数原型如下。

BOOLPlaySound(LPCSTRlpszSound,HMODULEhMod,DWORDfdwSound);参数:

lpszSound指定了要播放声音的字符串,该参数可以是WAVE文件的名字、WAVE资源名、内存中声音数据的指针或在系统注册表WIN.INI中定义的系统事件声音。如果该参数为NULL则停止正在播放的声音。

hMod是应用程序的实例句柄,当播放WAVE资源时使用该参数,否则它必须为NULL。

fdwSound是标志的组合,如表7.5所示。若函数调用成功则返回TRUE,否则返回FALSE。上一页返回7.3MCI编程步骤MCI为用户提供了控制不同多媒体设备的函数库,这些函数库允许用户以不同的方式访问设备。在MFC中使用MCI函数进行多媒体设备控制的一般步骤为:打开设备→设置或获取设备相关信息→播放设备→关闭设备等几个过程。实际上,上述过程的操作都要向多媒体设备发送MCI指令。指令发送一般是通过调用表7.3中的mciSendCommand(用于发送命令消息)或mciSendString(用于发送字符串命令)函数进行的。其中的mciSendCommand函数原型如下:MCIERRORmciSendCommand(MCIDEVICEIDIDDevice,UINTuMsg,DWORD fdwCommand,DWORDdwParam);下一页返回7.3MCI编程步骤参数:

IDDevice表示接受MCI命令的设备标识符,但当MCI命令为MCI_OPEN时,此参数应为0。

uMsg表示要发送的命令消息。

fdwCommand表示MCI命令消息的标志位。

dwParam表示指向MCI命令消息数据结构的指针。该函数成功调用时返回0,否则返回非0值。另外,在调用MCI函数所在的源文件开头处(最好是stdafx.h(建立预编译头文件))还要包含文件mmsystem.h以及编译时加入winmm.lib库或在程序中加入下列语句:#pragmacomment(lib,"winmm32.lib")下面是MCI编程过程中不可缺少的4个步骤,其列出的代码,在例7.1中都有过使用。上一页下一页返回7.3MCI编程步骤1.打开设备为了简化代码,MCI为不同的多媒体设备打开提供相应的数据结构类型。例如,对于waveaudio设备提供了MCI_WAVE_OPEN_PARMS结构,对于overlay提供了MCI_OVLY_OPEN_PARMS结构等。若用户不想使用设备中特定的参数数据,则可使用统一的MCI_OPEN_PARMS结构,其原型如下:上一页下一页返回7.3MCI编程步骤typedefstruct{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄

MCIDEVICEIDwDeviceID//返回的设备表示符

LPCSTRlpstrDeviceType;//MCI设备的类型

LPCSTRlpstrElementName;//设备元素

LPCSTRlpstrAlias;//可选的设备别名}MCI_OPEN_PARMS;上一页下一页返回7.3MCI编程步骤

显然,打开一个多媒体设备的代码过程是首先定义一个MCI_OPEN_PARMS(或其他)结构类型变量,然后给结构变量中的相应参数赋值,最后调用mciSendCommand向设备发送MCI_OPEN命令消息,当调用成功时,即可获得相应的设备标识符。2.设置或获取设备信息使用MCI_SET和MCI_STATUS命令可以分别用于设置和获取设备信息,并在用函数mciSendCommand发送命令时使用相应的MCI_SET_PARMS和MCI_STATUS_PARMS结构,它们的原型如下:上一页下一页返回7.3MCI编程步骤typedefstruct{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄

DWORDdwTimeFormat;//时间格式

DWORDdwAudio;//输出声道}MCI_SET_PARMS;typedefstruct{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄

DWORDdwReturn;//要获取的设备信息

DWORDdwItem;//需要获取的信息项

DWORDdwTrack;//取目的长度或取目号}MCI_STATUS_PARMS;上一页下一页返回7.3MCI编程步骤3.播放设备使用MCI_PLAY命令可以使设备播放多媒体文件,并在用函数mciSendCommand发送命令时,使用相应的MCI_PLAY_PARMS结构,其原型如下:Typedefstruct{DWORDdwCallback;//低字节用于MCI_NOTIFY的窗口句柄

DWORDdwFrom;//播放的起点位置

DWORDdwTo;//播放的终点位置}MCI_PLAY_PARMS;

但需要注意的是:为了便于程序判断媒体是否播放结束,还应该让MCI向窗口发送MCI_NOTIFY消息。上一页下一页返回7.3MCI编程步骤

而且,在调用的窗口中应加入MM_MCINOTIFY的消息处理。但由于ClassWizard不支持该消息,因而需要手动进行。例如,若接收MM_MCINOTIFY消息的窗口是一个对话框CMyDlg,则添加消息处理的过程如下。(1)切换到项目工作区窗口的ClassView页面,右击CMyDlg类,选择快捷菜单中的AddMemberFunction命令。在弹出的AddMemberFunction对话框中为CMyDlg类添加保护型的成员函数,其原型如下:LRESSULTOnMCINotify(WPARAMwParam,LPARAMlParam);上一页下一页返回7.3MCI编程步骤(2)在类CMyDlg的消息入口处,添加下列消息宏指令。ON_MESSAGE(MM_MCINOTIFY,OnMCINotify)(3)编写CMyDlg::OnMCINotify函数代码。LRESULTCMyDlg::OnMCINotify(WPARAMwParam,LPARAMiParam){…… returnFALSE;}4.关闭设备使用MCI_STOP和MCI_CLOSE命令可以分别用于停止播放和关闭设备,由于它们不需要设置或返回附加的信息因此用户不必考虑相应的MCI_GENERIC_PARMS结构。上一页返回7.4使用MCIWnd窗口类

上述直接使用MCI(媒体控制接口)的底层函数进行多媒体设备控制的方法需要用户编写大量的代码,而另一种更为简单的方法是使用MCIWnd(MediaControlInterfaceWindow)窗口类,它仅需要少量的程序就可以在应用程序中添加多媒体的控制功能。

MCIWnd是一个控制多媒体设备的窗口类,它提供的函数、消息以及宏与上述的MCI的底层功能相似。若在应用程序中使用MCIWnd窗口类,还必须在调用MCIWnd函数所在的源文件的前面(最好是stdafx.h)添加vfw.h的头文件,以及编译时加入vfw32.lib库或在程序中加入语句#pragmacomment(lib,"vfw32.lib")。下一页返回7.4使用MCIWnd窗口类

在MCIWnd窗口类中,虽然它所提供的函数并不多,但是它所提供的宏却非常多,并且基本上与MCI的底层功能相对应。在应用程序中使用MCIWnd窗口类的一般步骤如下。(1)在程序中调用MCIWndRrgisterClass函数注册MCI窗口类,以便以后用CreateWindow或CreateWindowEx函数创建窗口,或者直接调用函数MCIWndCreate创建窗口。(2)获得相应的窗口句柄后,就可调用MCIWndOpen宏来打开设备。(3)由于MCIWnd窗口提供了相应的媒体控制按钮,因而不需要用户编写额外的代码。(4)作为技巧,用户还应该跟踪MCIWnd窗口的一些消息如:MCIWNDMNOTIFYSIZE来调整MCIWnd窗口。上一页下一页返回7.4使用MCIWnd窗口类[例7.2]利用MCIWnd窗口类在多文档应用程序中添加一个多媒体播放器。(1)用MFCAppWizard(exe)创建一个多文档应用程序名为:多媒体播放。(2)在预编译头文件StdAfx.h中放入包含文件,以使应用程序能使用所有的多媒体代码。由于项目中的每一个文件已经包含StdAfx.h,所以在其他地方就不必再包含这些多媒体文件。在工作区FileView页面,打开头文件(.h)夹,找到StdAfx.h按如下添加代码。………………..#endif//_AFX_NO_AFXCMN_SUPPORT#include<vfw.h>#pragmacomment(lib,"vfw32.lib")………上一页下一页返回7.4使用MCIWnd窗口类(3)在应用程序类的CMyApp::InitInstance函数的最前面,使用MCIWndRegisterClass函数注册MCI窗口类。虽然,后面的创建窗口是直接调用函数MCIWndCreate来进行的,但还应该保证应用程序的运行系统拥有并支持MCIWnd(一个控制多媒体设备的窗口类)窗口类。BOOLCMyApp::InitInstance(){ if(!MCIWndRegisterClass())//注册MCIWnd窗口类

returnFALSE; AfxEnableControlContainer(); ………….}上一页下一页返回7.4使用MCIWnd窗口类(4)在CMyView.h的public中添加一个成员变量用于标识嵌入的MCIWnd窗口句柄。HWNDm_hMyMCIWnd;//HWND窗口句柄,定义窗口句柄对象(5)在CMyView类中添加OnInitialUpdate消息处理函数,并增加下列代码:voidCMyView::OnInitialUpdate(){ CView::OnInitialUpdate(); m_hMyMCIWnd=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(), MCIWNDF_NOTIFYSIZE|MCIWNDF_NOERRORDLG| WS_CHILD|WS_VISIBLE,NULL);//见下面说明1 if(m_hMyMCIWnd==NULL)return;//没创建子窗口,返回

constCString&filename=GetDocument()->GetPathName();//获得路径名

if(filename.GetLength()>0)//路径名字符串长度要大于0 MCIWndOpen(m_hMyMCIWnd,(LPCSTR)filename,0);//见下面说明2}上一页下一页返回7.4使用MCIWnd窗口类说明:函数MCIWndCreate(m_hWnd,AfxGetInstanceHandle(), MCIWNDF_NOTIFYSIZE|MCIWNDF_NOERRORDLG| WS_CHILD|WS_VISIBLE,NULL);函数功能:创建一个使用MCI设备的窗口,返回MCI设备窗口的句柄。参数:m_hWnd——父窗口句柄。AfxGetInstanceHandle()——当前实例句柄,AfxGetInstanceHandle()函数就是获得实例句柄函数。NULL——打开的MCI设备的名称或多媒体文件名。MCIWnd——窗口的风格。上一页下一页返回7.4使用MCIWnd窗口类MCIWNDF_NOTIFYSIZE——MCIWnd窗口大小改变时通知父窗口。MCIWNDF_NOERRORDLG——禁止显示MCI错误信息。WS_CHILD——创建一个子窗口,不得与WS_POPUP风格一起用。WS_VISIBLE——指定一个初始时可见的窗口。函数MCIWndOpen(m_hMyMCIWnd,(LPCSTR)filename,0);函数功能:向MCIWnd窗口发送MCIWNDM_OPEN消息,打开某MCI设备,将其关联到一个MCIWnd窗口。若调用成功则返回值为0。上一页下一页返回7.4使用MCIWnd窗口类参数:m_hMyMCIWnd——MCI窗口句柄。(LPCSTR)filename——MCI文件名。0——设备打开方式标识。LPCSTR——指向字符串常量的32位指针。(6)在CMyView.cpp的构造函数中将成员变量m_hMyMCIWnd初始化为NULL,由于以后要判断m_hMyMCIWnd是否为NULL,所以这一步骤非常重要。m_hMyMCIWnd=NULL;//窗口句柄对象置空上一页下一页返回7.4使用MCIWnd窗口类(7)由于MCIWnd会发送一个重要的消息MCIWNDM_NOTIFYSIZE(窗口大小改变),所以还要添加处理该消息的代码来调整窗口的大小以便能及时更新显示。但ClassWizard所封装的消息列表没有此消息,因而需要手动进行。在CMyView.h文件中的消息声明处添加下列代码。//{{AFX_MSG(CMyView) //NOTE-theClassWizardwilladdandremovememberfunctionshere.//下面参数中UINT:表示32位无符号整数,LONG:表示32位带符号整数afx_msgLONGOnNotifySize(UINTwParam,LONGlParam); //DONOTEDITwhatyouseeintheseblocksofgeneratedcode! //}}AFX_MSG DECLARE_MESSAGE_MAP()上一页下一页返回7.4使用MCIWnd窗口类(8)在CMyView.cpp的消息入口处添加下列代码:BEGIN_MESSAGE_MAP(CMyView,CView) //{{AFX_MSG_MAP(CMyView) ……… ON_MESSAGE(MCIWNDM_NOTIFYSIZE,OnNotifySize) //}}AFX_MSG_MAP //Standardprintingcommands ………END_MESSAGE_MAP()上一页下一页返回7.4使用MCIWnd窗口类(9)为CMyView类添加该消息的处理函数OnNotifySize,用于调整MCIWnd窗口的大小,并添加下列代码(连同函数体本身全用手工加代码):LONGCMyView::OnNotifySize(UINTwParam,LONGlParam){ CRectrc; CFrameWnd*pParent=GetParentFrame();//获得主框架窗口

if(m_hMyMCIWnd) { ::GetWindowRect(m_hMyMCIWnd,rc);//见后面说明

pParent->CalcWindowRect(rc,CWnd::adjustBorder);//由客户矩形计算窗口矩形

CStringsize(rc.Width(),rc.Height());//矩形的宽度、高度大小

if(GetExStyle()&WS_EX_CLIENTEDGE)//GetExStyle窗口的扩展风格,

//WS_EX_CLIENTEDGE具有3D外观的窗口,即边框为凹入边

{ size+=4;上一页下一页返回7.4使用MCIWnd窗口类size+=4; } pParent->SetWindowPos(NULL,0,0,10,10, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); } else { pParent->SetWindowPos(NULL,0,0,200,160, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); } return1;}上一页下一页返回7.4使用MCIWnd窗口类说明:函数GetParentFrame;如果希望在OnCreate函数中就能够得到主框架窗口的话,就必须使用该函数。函数GetWindowRect(m_hMyMCIWnd,rc);是窗口相对于整个屏幕的坐标,屏幕左上点为0,0。参数:

m_hMyMCIWnd(hWnd)——窗口句柄。

rc(lpRect)——指向一个RECT结构的指针,该结构接收窗口的左上角和右下角的屏幕坐标。函数CalcWindowRect(rc,CWnd::adjustBorder);由客户矩形计算窗口矩形。上一页下一页返回7.4使用MCIWnd窗口类参数:

rc(LPRECTlpClientRect)——指向一个保存窗口矩形的计算结果的RECT结构成CRect对象。

CWnd::adjustBorder(nAdjustType)——用于就位置编辑的枚举类型,可以是下列值之一。

CWnd::adjustBorder=0表示计算将忽略滚动条的大小。

CWnd::adjustOutside=1表示最后计算出的矩形值中包括滚动条的尺寸。上一页下一页返回7.4使用MCIWnd窗口类

函数原型:virtualvoidCalcWindowRect(LPRECTlpClientRect,UINTnAdiustType=adjustBorder)。函数SetWindowPos(NULL,0,0,10,10,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE)

函数功能:该函数改变一个子窗口,弹出式窗口顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。函数原型:BOOLSetWindowPos(HWNhWnd,HWNDhWndlnsertAfter,intX,intY,intcx,intcy,UNITFlags);上一页下一页返回7.4使用MCIWnd窗口类参数:NULL(hWnd)——窗口句柄。0(x)——以客户坐标指定窗口新位置的左边界。0(Y)——以客户坐标指定窗口新位置的顶边界。200(cx)——以像素指定窗口的新的宽度。160(cy)——以像素指定窗口的新的高度。SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE(uFlags)——窗口尺寸和定位的标志。该参数可以是下列值的组合。上一页下一页返回7.4使用MCIWnd窗口类SWP_ASNCWINDOWPOS——如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。

SWP_DEFERERASE——防止产生WM_SYNCPAINT消息。

SWP_DRAWFRAME——在窗口周围画一个边框(定义在窗口类描述中)。

SWP_FRAMECHANGED——给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。

SWP_HIDEWINDOW——隐藏窗口。上一页下一页返回7.4使用MCIWnd窗口类SWP_NOACTIVATE——不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。

SWP_NOCOPYBITS——清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后复制回客户区。

SWP_NOMOVE——维持当前位置(忽略X和Y参数)。

SWP_NOOWNERZORDER——不改变z序中的所有者窗口的位置。

SWP_NOREDRAW——不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗口移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并重画窗口的任何部分和父窗口需要重画的部分。上一页下一页返回7.4使用MCIWnd窗口类SWP_NOREPOSITION——与SWP_NOOWNERZORDER标志相同。SWP_NOSENDCHANGING——防止窗口接收WM_WINDOWPOSCHANGING消息。SWP_NOSIZE——维持当前尺寸(忽略cx和Cy参数)。SWP_NOZORDER——维持当前Z序(忽略hWndlnsertAfter参数)。SWP_SHOWWINDOW——显示窗口。返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误消息,请调用GetLastError函数。上一页下一页返回7.4使用MCIWnd窗口类参数:

hWndlnsertAfter(但在这里没用此参数)——在Z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一。

HWND_BOTTOM——将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。

HWND_DOTTOPMOST——将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。

HWND_TOP——将窗口置于Z序的顶部。

HWND_TOPMOST——将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。上一页下一页返回7.4使用MCIWnd窗口类

(10)复制一个.avi文件(如Demo4142)到本项目文件夹中,编译运行后单击窗口上的菜单打开,将“Demo4142”打开,便出现avi图形,单击图形下面的箭头,它就能播放了,并能发出声音,结果如图7.3所示。注意:如果不想用这种方式打开.avi文件,可自己做个菜单来打开.avi文件,步骤如下。①建一个菜单ID为ID_AVI,名字为:打开AVI文件。②将该菜单消息映射到视图类(CMyView.cpp)中,并添加下列代码。上一页下一页返回7.4使用MCIWnd窗口类voidCMyView::OnAvi(){CStringfilename;CFileDialogdlg(TRUE,"avi",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"AVI文件(*.avi)|*.avi||");if(dlg.DoModal()==IDOK)上一页返回7.4使用MCIWnd窗口类{filename=dlg.GetPathName();图7.3运行结果

if(m_hMyMCIWnd!=NULL)MCIWndDestroy(m_hMyMCIWnd);m_hMyMCIWnd=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(),0,filename);}}③编译运行,单击菜单上的“打开AVI文件”命令,出现“打开”对话框,单击复制到此文件夹的AVI文件并单击“打开”按钮,便出现播放屏幕。最大化后,单击小箭头就开始播放带声音的多媒体影像了。上一页下一页返回7.5章后实训实训1实现视频和多媒体文件操作该操作完成后要满足下列要求。①程序运行后是一个空白窗口;②在这个窗口的任何地方单击,即可建立并显示MCIWnd窗口;③在空白窗口(不是MCIWnd窗口)的任何地方单击,开始播放,再单击则暂停,再单击又播放……④在任意时刻用鼠标左键都可以拖动MCIWnd窗口(或说是MCIWnd标题条)到空白窗口(父窗口)的任何地方;⑤在何时刻用鼠标右击空白窗口的任何地方都可以关闭MCIWnd窗口。运行结果如图7.4所示。程序设计如下。下一页返回7.5章后实训(1)利用MFCAppWizard(exe)创建一个单文档的应用程序,名为“视频播放器”。(2)选择Project->Settings命令,打开ProjectSettings对话框。(3)打开Link选项卡,在Object/library/modules(对象/库模块)中输入vfw32.lib单击OK按钮,如图7.5所示。上一页下一页返回7.5章后实训(4)在视图类的执行文件CMyView.cpp中添加包含文件#include"vfw.h"(5)在视图类的头文件CMyView.h中添加两个成员变量。private:HWNDm_videoWnd;//容纳MCIWnd窗口

BOOLm_paused;//作为指示播放是否暂停的标志使用在视图类的执行文件CMyView.cpp的构造函数中,对成员变量初始化。

m_videoWnd=NULL;上一页下一页返回7.5章后实训(6)用ClassWizard在视图类(CMyView)中添加鼠标左键按下WM_LBUTTONDOWN映射消息(MCIWnd是用鼠标左键控制的,当用户在用户区的任一地方单击鼠标左键时,程序就开始检查MCIWnd是否已经存在。如果不存在,就建立它;如果已经存在,播放的暂停或开始则取决于当前的状态),并添加代码。voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){ CStringfilename("FILEMOVE.avi"); //如果MCIWnd不存在,则创建它

if(m_videoWnd==NULL) m_videoWnd=MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(), WS_CHILD|WS_CAPTION|WS_VISIBLE|MCIWNDF_SHOWPOS|MCIWNDF_SHOWNAME,filename); //已经存在则根据需要暂停或重新播放,这取决于m_paused上一页下一页返回7.5章后实训else {if(m_paused) {MCIWndPlay(m_videoWnd); m_paused=FALSE; } else { MCIWndPause(m_videoWnd); m_paused=TRUE; } }}上一页下一页返回7.5章后实训(7)用ClassWizard在视图类(CMyView)中添加鼠标右键WM_RBUTTONDOWN按下映射消息(关闭MCIWnd窗口)。voidCMyView::OnRButtonDown(UINTnFlags,CPointpoint){//如果MCIWnd存在,则关闭它

if(m_videoWnd!=NULL) { MCIWndDestroy(m_videoWnd); m_videoWnd=NULL; }}上一页下一页返回7.5章后实训(8)复制一个.avi视频文件(如:FILEMOVE.avi)到本项目文件夹中。注意:程序语句filename("FILEMOVE.avi")中的FILEMOVE.avi文件名,必须和复制到本项目文件夹中的文件名(也不要带扩展名.avi)是一样的。(9)编译运行,结果如图7.4所示。上一页下一页返回7.5章后实训实训2制作一个可以播放Mid音乐的应用程序可通过“打开”按钮将多支乐曲放在列表框中,之后选中列表框中的某支乐曲,再点击“播放”按钮,就可听该乐曲了。

MCI(MediaControlInterFace)是一种播放多媒体文件的方法,如WAV、MIDI或AVI文件。在本例中,使用媒体控制接口MCI实现MID文件的播放。设计如下。 (1)利用MFCAppWizard创建一个基于对话框的应用程序,名为MID播放器。(2)参照图7.6,向对话框添加如表7.6所示的控件。(3)在CMIDDlg类中为列表框IDC_LIST1添加CListBox类型成员变量,名为m_midbox。上一页下一页返回7.5章后实训(4)向工程中添加MID类库,文件名为Midi.h和Midi.cpp,步骤如下。①将Midi.h和Midi.cpp两个文件(见附录)复制到本工程文件夹中。②选择Project→Addtoproject→Files命令在出现的InsertFilesintoProject对话框中,按住Ctrl键同时选中Midi.h和Midi.cpp这两个文件,便在“文件名”文本框里出现这两个文件名单击OK按钮。这两个文件就加到项目中了。上一页下一页返回7.5章后实训(5)将Midi.h文件包含在“MID播放器Dlg.h”文件中即#include"Midi.h"(6)在“MID播放器Dlg.h”文件中的public下,添加如下代码:CMidiMymid;intnIndex;//用于记录当前播放MID的顺序(7)连接Winmm.lib类库,步骤如下:选择Project→Settinge…命令打开ProjectSettings对话框。在MicrosoftFoundationClasses中选择UseMFCinaStaticLibrary选项打开Link选项卡,在Object/librarymodules文本框中输入Winmm.lib,单击OK按钮。上一页下一页返回7.5章后实训(8)向“MID播放器Dlg”类中添加IDC_OPEN、IDC_PLAY、IDC_STOP、IDC_NEXT的BN_CLICKED及IDC_LIST1的LBN_SELCHANGE和LBN_DBLCLK消息映射加代码:voidCMIDDlg::OnOpen(){ CStringszFilter="MIDFiles(*.MID)|*.MID||"; CFileDialogDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter); CStringMidName; if(Dlg.DoModal()==IDOK) { MidName=Dlg.GetFileName(); m_midbox.AddString(MidName); }}上一页下一页返回7.5章后实训voidCMIDDlg::OnPlay(){ CStringGetMidName; m_midbox.GetText(nIndex,GetMidName); Mymid.Open(GetMidName); Mymid.Play();}voidCMIDDlg::OnStop(){Mymid.Stop();Mymid.Close();}上一页下一页返回7.5章后实训voidCMIDDlg::OnNext(){intcount=m_midbox.GetCount()-1;if(nIndex<count){++nIndex;m_midbox.SetCurSel(nIndex);OnStop();OnPlay();}}上一页下一页返回7.5章后实训voidCMIDDlg::OnSelchangeList1(){nIndex=m_midbox.GetCurSel();}voidCMIDDlg::OnDblclkList(){nIndex=m_midbox.GetCurSel(); OnStop(); OnPlay();}(9)编译运行,结果如图7.7所示。上一页下一页返回7.5章后实训实训3媒体播放程序(1)创建一个多文档的应用程序,名为:媒体播放。(2)添加一个菜单资源:选择Menu命令双击IDR_MYTYPE选项,在“查看”菜单中添加一个命令,ID为ID_VIEW_MEDIA,标题(Caption):媒体播放器(&M)。(3)向项目中加入一个对话框资源,ID为IDD_DIALOG1,类名为CMyMediaDlg。(4)右击对话框上的任意一点,选中InsertActiveXControl并单击,出现如图7.8所示的对话框,选中ActiveMovieControlObject选项,单击ok按钮。发现ActiveMovie控件就出现在对话框上了,其ID为IDC_ACTIVEMOVIECONTROL1,如图7.9所示。上一页下一页返回7.5章后实训

注意:图7.8程序编辑器的控件面板中可能没用ActiveMovie控件,也就是图7.8对话框中找不到ActiveMovieControlObject,可按下面的方法将其加入。选择“开始”→“运行”命令在“打开:”中输入regsvr32msdxm.ocx单击“确定”按钮,屏幕上出现RegSvr32对话框,上面写:msdxm.ocx中的DllRegisterServer成功单击“确定”按钮,这时图7.8的对话框中就出现了ActiveMovieControlObject。(5)删除对话框上的Cancel按钮,参照图7.10向对话框添加如表7.7所示的控件。上一页下一页返回7.5章后实训(6)为对话框中的CActiveMovie(IDC_ACTIVEMOVIECONTROL1)控件添加一个类型为CActiveMovie3的成员变量m_ActiveMovie。(7)在stdAfx.h文件中包含以下文件,即:………endif//_AFX_NO_AFXCMN_SUPPORT#include<vfw.h>#pragmacomment(lib,"vfw32.lib")//{{AFX_INSERT_LOCATION}}………上一页下一页返回7.5章后实训(8)①在视图类“媒体播放器View.h”中添加一个公有成员变量即:

HWNDm_hMCIWnd;

在视图类“媒体播放器View.cpp”的构造函数中置初值m_hMCIWnd=NULL;②在视图类“媒体播放器View”中添加添加一个消息映射函数OnNotifySize,使得该程序能处理消息MCIWNDM_NOTIFYSIZE(窗口大小改变),即:在“媒体播放器View.h”文件中的消息映射处写一个消息处理函数的声明:

afx_msgLONGOnNotifySize(UINTwParam,LONGlParam);

在“媒体播放器View.cpp”文件中的消息映射开始处输入:

ON_MESSAGE(MCIWNDM_NOTIFYSIZE,OnNotifySize)上一页下一页返回7.5章后实训(9)手工将OnNotifySize(UINTwParam,LONGlParam)函数连同函数代码全写在“媒体播放器View.cpp”文件中LONGCMyView::OnNotifySize(UINTwParam,LONGlParam){ CRectm_Rect; //获得父窗口框架指针

CFrameWnd*m_pParent=GetParentFrame(); if(m_hMCIWnd) { ::GetWindowRect(m_hMCIWnd,m_Rect); m_pParent->CalcWindowRect(m_Rect,CWnd::adjustBorder); CSizem_Size(m_Rect.Width(),m_Rect.Height());上一页下一页返回7.5章后实训m_pParent->SetWindowPos(NULL,0,0,m_Size.cx,m_Size.cy,SWP_NOZORDER| SWP_NOACTIVATE|SWP_NOMOVE); } else {//设置窗口位置

m_pParent->SetWindowPos(NULL,0,0,200,300,SWP_NOZORDER| SWP_NOACTIVATE|SWP_NOMOVE); } return1;}上一页下一页返回7.5章后实训(10)将对话框类包含在“媒体播放器View.cpp”文件中,即#include"MyMediaDlg.h"在视图中弹出对话框,即将菜单命令消息(ID_VIEW_MEDIA)映射到视图类中,并填写如下代码:voidCMyView::OnViewMedia(){CMyMediaDlgm_MyMediaDlg;if(m_MyMediaDlg.DoModal()!=IDOK)return;}上一页下一页返回7.5章后实训(11)在应用程序“媒体播放器.cpp”的初始化函数中添加如下代码:BOOLCMyApp::InitInstance(){ if(!MCIWndRegisterClass()) returnfalse; AfxEnableControlContainer();………}上一页下一页返回7.5章后实训(12)在视图类“媒体播放器View.cpp”文件中添加OnInitialUpdate函数,并添加代码:voidCMyView::OnInitialUpdate(){ CView::OnInitialUpdate(); m_hMCIWnd=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(), MCIWNDF_NOTIFYSIZE|MCIWNDF_NOERRORDLG| WS_CHILD|WS_VISIBLE,NULL); if(m_hMCIWnd==NULL)return; //获得媒体文件的路径上一页下一页返回7.5章后实训constCString&m_filename=GetDocument()->GetPathName(); if(m_filename.GetLength()>0) //在MCIWnd窗口中打开该媒体文件

MCIWndOpen(m_hMCIWnd,(LPCSTR)m_filename,0);}(13)为对话框类上的各个按钮添加BN_CLICKED消息映射函数,并添加代码:上一页下一页返回7.5章后实训①IDC_OPEN_MEDIA(打开文件)。voidCMyMediaDlg::OnOpenmedia(){//创建一个文件对话框类对象

CFileDialogm_FileDlg(TRUE,NULL,NULL,0,"*.avi|*.avi|*.*|*.*|",NULL); if(m_FileDlg.DoModal()==IDOK) {//获得媒体文件路径名

CStringm_PathName=m_FileDlg.GetPathName(); m_PathName.MakeUpper(); //打开媒体文件

m_ActiveMovie.SetFileName(m_PathName); }}上一页下一页返回7.5章后实训②IDC_ADDVOLUME(增强音量)。voidCMyMediaDlg::OnAddvolume(){ longm_volume=m_ActiveMovie.GetVolume();//获得当前音量值,值为-600 m_ActiveMovie.Pause();//暂停播放

//如果音量大于某些值,给出提示信息,禁止继续调大音量,否则将音量以50为单位递增

//注:该极限值可根据自己的实际环境来设置

if(m_volume>=0) MessageBox("已经是最大音量!","提示!",MB_OK);上一页下一页返回7.5章后实训else m_ActiveMovie.SetVolume(m_volume+50); m_ActiveMovie.SetFullScreenMode(false); m_ActiveMovie.Run();//继续播放}③IDC_DELVOLUME(减少音量)。voidCMyMediaDlg::OnDelvolume(){long m_volume=m_ActiveMovie.GetVolume();m_ActiveMovie.Pause();if(m_volume<=-2000) MessageBox("已经是最小音量!","提示!",MB_OK);上一页下一页返回7.5章后实训else m_ActiveMovie.SetVolume(m_volume-50); m_ActiveMovie.SetFullScreenMode(false); m_ActiveMovie.Run();}④IDC_FULLSHOW(全屏显示)。voidCMyMediaDlg::OnFullshow(){m_ActiveMovie.Pause(); m_ActiveMovie.SetFullScreenMode(true);//全屏显示

m_ActiveMovie.Run();}上一页下一页返回7.5章后实训⑤IDC_START(开始)。voidCMyMediaDlg::OnStart(){m_ActiveMovie.Run();m_ActiveMovie.SetFullScreenMode(false);}⑥IDC_PAUSE(暂停)。voidCMyMediaDlg::OnPause(){ m_ActiveMovie.Pause(); m_ActiveMovie.SetFullScreenMode(false);}上一页下一页返回7.5章后实训⑦IDC_GOON(继续)。voidCMyMediaDlg::OnGoon(){m_ActiveMovie.Run();m_ActiveMovie.SetFullScreenMode(false);}⑧IDC_STOP(停止)。voidCMyMediaDlg::OnStop(){m_ActiveMovie.Stop(); }上一页下一页返回7.5章后实训(14)编译运行,出现图7.11所示的界面。①选择“文件”→“打开”命令,打开“GLOBE(.avi)”文件,出现图7.12所示的界面,单击图形下面的按钮,则开始播放。②选择“查看”→“多媒体播放器”命令出现如图7.13所示的界面,单击“打开文件”按钮,打开“CLOCK(.avi)”文件,出现图7.14所示的界面,播放后,单击界面上的各个按钮控件,其功能均能实现。上一页返回图7.1播放声音程序的对话框布局返回图7.2为程序添加多媒体支持返回表7.1MCI设备类型返回设备类型说明设备描述设备驱动程序animation动画播放设备MCI_DEVICE_ANIMATIONcdaudioCD音频设备,如激光唱机MCI_DEVICE_CD_AUDIOMCICDA.DRVdat数字音频磁带机MCI_DEVICE_DATdigitalvideo数字视频设备MCI_DEVICE_DIGITAL_VIDEOother未定义的MCI设备MCI_DEVICE_OTHERoverlay窗口中的模拟设备MCI_DEVICE_OVERLAYscanner图形扫描设备MCI_DEVICE_SCANNERsequencerMIDI设备MCI_DEVICE_SEQUE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论