您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 10多媒体应用程序设计
Windows程序设计何倩桂电信息与通信学院heqian@guet.edu.cn教材:VisualC++面向对象与可视化程序设计(第二版)黄维通编著,清华大学出版社参考书:1.《C++程序设计教程》,钱能编著,清华大学出版社2《VisualC++程序设计-基础与实例分析》,朱晴婷编著第10讲多媒体应用程序的设计212.1利用音频函数为了介绍多媒体程序的设计,我们先介绍一个非常简单的例子,希望读者能够通过这个简单的例子,了解音频文件的播放方法312.1.1一个简单的应用实例【例12-1】设计一个简单的音频播放程序,程序启动时,播放windows系动启动时候的音乐41.创建工程文件MCIStart;打开Stdafx.h文件,在#ifndef_AFX_NO_AFXCMN_SUPPORT语句的上一行顶头加入语句#includemmsystem.h2.将winmm.lib与应用程序链接起来3.在MCIStartDlg.cpp的OnInitDialog()函数中的returnTRUE之前加上代码:sndPlaySound(SystemStart,SND_ASYNC);12.1.2几个常用的音频函数(1)MessageBeep()函数:用来播放系统提示音(2)sndPlaySound()函数:播放wav音频(3)PlaySound()函数:播放来自资源中的声音5PlaySound()sndPlaySound()MessageBeep()功能包含关系12.1.3用MCI控制波形声音的播放MCIERRORmciSendCommand(MCIDEVICEIDIDDevice,//接收命令消息的MCI设备IDUINTuMsg,//发送的命令消息DWORDfdwCommand,//命令消息的标志集DWORD_PTRdwParam)//消息参数的结构体地址6常用的MCI设备消息见教材表12-57在调用MCI设备时可用mciGetErrorString()检测错误,该函数的原型如下:BOOLmciGetErrorString(DWORDfdwError,//错误代码LPTSTRlpszErrorText,//指向错误内容字串的指针UINTcchErrorText//错误内容的缓冲区容量)【例12-2】编写一个音频播放器程序,可以选择音频文件,并控制其播放、暂停播放、暂停后的继续播放以及停止播放的功能8IDC_OPEN_BUTTONIDC_CLOSE_BUTTONIDC_START_BUTTONIDC_PAUSE_BUTTONIDC_STOP_BUTTONIDC_EXIT_BUTTON91.将头文件mmsystem.h加入到文件Stdafx.h中,将多媒体函数库winmm.lib通过project菜单中的seetings命令来与程序链接起来2.在CMCIPlayerDlg类上增加Protected类型的成员变量,具体如下:BOOLm_PSign(作为判断正在播放的标识)BOOLm_ASign(作为判断正在播放的标识)、DWORDdwError(用来储存错误代码)、MCIDEVICEIDm_MCIDeviceID(用来储存打开设备的ID值)charszErrorBuf[MAXERRORLENGTH](用来储存出错内容)10BOOLCMCIPlayerDlg::OnInitDialog(){CDialog::OnInitDialog();…//TODO:Addextrainitializationherem_PSign=FALSE;//初始化正在播放标识m_ASign=FALSE;//初始化正在暂停标识m_MCIDeviceID=0;//初始化设备标识returnTRUE;}voidCMCIPlayerDlg::OnOpenButton()//打开一个文件{CStringfilename;//定义CString类的filename用来存储文件名CStringfileext;//定义CString类的fileext用来存储文件扩展名MCI_OPEN_PARMSmciOpenParms;//定义结构体变量用来存储打开文件的信息和返回的设备标识信息DWORDdwError;//定义dwError用来储存返回的错误标识staticcharszFilter[]=波形音频文件(*.wav)|*.wav|MIDI序列(*.mid)|*.mid\0;CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);//通过打开按钮时显示的内容11if(dlg.DoModal()==IDOK){filename=dlg.GetFileName();//获取打开的文件名fileext=dlg.GetFileExt();//获取打开的文件扩展名if(m_PSign)//如果程序正在播放,则关闭{dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);//关闭正在播放的声音if(dwError)//如果关闭不成功,则显示出错的原因{if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MCI出错,MB_ICONWARNING);elseMessageBox(不明错误标识,MCI出错,MB_ICONWARNING);//给出相应报告return;}}12//如果没有声音正在播放,则获取打开文件的后辍,并根据后辍决定相应的打开类型if(!strcmp(wav,fileext))//当后辍为wav时mciOpenParms.lpstrDeviceType=waveaudio;elseif(!strcmp(mid,fileext))//当后辍为mid时mciOpenParms.lpstrDeviceType=sequencer;mciOpenParms.lpstrElementName=filename;//将打开的文件名存入mciOpenParms结构体中dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);//发送打开文件命令,MCI_OPEN_TYPE参数说明设备类型名包含在mciOpenParms结构体中,//MCI_OPEN_ELEMENT参数说明要打开的文件名包含在mciOpenParams结构体中13if(dwError)//如果打开不成功,则显示出错的原因{if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MCI出错,MB_ICONWARNING);elseMessageBox(不明错误标识,MCI出错,MB_ICONWARNING);return;}m_MCIDeviceID=mciOpenParms.wDeviceID;//将获取的设备ID值赋给全局变量m_MCIDeviceIDm_PSign=FALSE;//设置正在播放标识为FALSEm_ASign=FALSE;//设置正在暂停标识为FALSE}}1415voidCMCIPlayerDlg::OnStartButton()//从头开始播放{MCI_PLAY_PARMSmciPlayParms;//结构体变量存储播放相关信息if(!m_PSign)//如果没有正在播放的声音{mciPlayParms.dwCallback=(long)GetSafeHwnd();//为发送MM_MCINOTIFY消息指定窗口句柄mciPlayParms.dwFrom=0;//设置播放位置从头开始dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);//开始播放声音,参数MCI_FROM说明开始播放的位置包含在mciPlayParms结构体中//参数MCI_NOTIFY的意义是播放完后发送MM_MCINOTIFY消息16if(dwError){if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MCI出错,MB_ICONWARNING);elseMessageBox(不明错误标识,MCI出错,MB_ICONWARNING);return;}m_PSign=TRUE;//设置正在播放标识为TRUE}}voidCMCIPlayerDlg::OnPauseButton(){if(m_PSign)//如果有正在播放的声音{if(!m_ASign)//如果不是暂停状态{dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL);//则暂停播放if(dwError){if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MCI出错,MB_ICONWARNING);elseMessageBox(不明错误标识,MCI出错,MB_ICONWARNING);return;}m_ASign=TRUE;//设置正在暂停标识为TRUE}17else//如果已经是暂停状态{dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL);//则继续播放if(dwError){if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MCI出错,MB_ICONWARNING);elseMessageBox(不明错误标识,MCI出错,MB_ICONWARNING);return;}m_ASign=FALSE;//设置正在暂停标识为FALSE}}}18voidCMCIPlayerDlg::OnStopButton(){dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//发送停止命令消息,参数MCI_WAIT说明当命令执行结束后函数才返回值if(dwError){if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MCI出错,MB_ICONWARNING);elseMessageBox(不明错误标识,MCI出错,MB_ICONWARNING);return;}m_PSign=FALSE;//设置正在播放标识为FALSEm_ASign=FALSE;//设置正在暂停标识为FALSEMessageBox(如要播放新的文件,请在打开前先关闭现有文件,注意,MB_ICONQUESTION);//提请用户注意先关闭现有文件}19voidCMCIPlayerDlg::OnCloseButton()//关闭当前设备{if(m_MCIDeviceID)//若什么文件都没有打开过,就不执行关闭操作{dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);if(dwError){if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))MessageBox(szErrorBuf,MC
本文标题:10多媒体应用程序设计
链接地址:https://www.777doc.com/doc-1467115 .html