




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、 编写代码实现制作一个音频文件播放器(1) 创建一个基于对话框的工程,工程名为ex123。在第二步的please enter a title for your dialog项中输入对话框标题:“MyWAVPlayer”。(2) 为工程添加多媒体组件。选择菜单:工程>添加到工程>Components and Controls菜单项,在弹出的Components and Controls Gallery对话框中双击Visual C+ Components 文件夹,然后选择Windows Multimedia library项,按Insert按钮:在弹出的对话框中按“确定”按钮,在继
2、续弹出的一个消息框中按“是”按钮,则多媒体组件被加入到当前工程中。选择Components and Controls Gallery对话框中的关闭按钮,关闭该对话框。(3) 定制对话框。将IDD_EX123_DIALOG对话框(MyWAVPlayer)中的静态文本控件以及“取消”按钮控件删除。将“确定”按钮的标题改为“关机”。新添3个按钮控件,其ID和标题分别设置如下。 按钮ID值Caption播放按钮IDC_BUTTON_PLAY播放停止按钮IDC_BUTTON_STOP停止打开按钮IDC_BUTTON_OPEN打开 (4) 为对话框类添加3个成员变量,并在构造函数中对它们进行初始化。3个成
3、员变量分别用来表示当前状态为播放、暂停状态和设备ID,如下: 变量类型变量名访问类型BOOLm_bIsPlayingprotectedBOOLm_bIsPauseprotectedMCIDEVICEIDm_MCIDeviceIDprotected 构造函数中的初始化代码:CEx123Dlg:CEx123Dlg(CWnd* pParent /*=NULL*/): CDialog(CEx123Dlg:IDD, pParent)1 / 9m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_bIsPause=FALSE;m_bIsPlaying=FA
4、LSE;m_MCIDeviceID=0;(5) 为CEx123Dlg对话框类添加3个成员函数:1)利用类向导添加WM_DESTROY消息的处理函数,代码如下:void CEx123Dlg:OnDestroy() CDialog:OnDestroy();/退出程序前先停止声音播放,再关闭设备/这里忽略了错误处理mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL); 2)添加一个处理MCI错误的函数。在ClassView页面中,右键单击CE
5、x123Dlg类,选择Add Member Function;添加成员函数类型为viod,函数描述为:ShowMCIError(DWORD dwError);访问方式为:private。函数代码内容为:void CEx123Dlg:ShowMCIError(DWORD dwError)char szErrorBufMAXERRORLENGTH;MessageBeep(MB_ICONEXCLAMATION);if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,"MCI错误
6、",MB_ICONEXCLAMATION);elseMessageBox("未知错误!","MCI错误",MB_ICONEXCLAMATION); 3)添加MM_MCINOTIFY消息的消息映射和处理函数。由于类向导不支持该消息,必须手工进行添加,添加时不要忘记包括三项内容:函数原型、消息映射入口项和函数体。在ex123Dlg.h文件中添加消息函数原型的声明:class CEx123Dlg : public CDialog/省略部分代码virtual BOOL OnInitDialog();afx_msg void OnSysCommand(U
7、INT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnDestroy();afx_msg LRESULT OnMciNotify(WPARAM wParam,LPARAM lParam);afx_msg void OnButtonOpen();afx_msg void OnButtonPlay();afx_msg void OnButtonStop();/AFX_MSGDECLARE_MESSAGE_MAP()private:void ShowMCIErro
8、r(DWORD dwError);在ex123Dlg.cpp文件中添加消息映射项:/省略部分代码BEGIN_MESSAGE_MAP(CEx123Dlg, CDialog)/AFX_MSG_MAP(CEx123Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_DESTROY()/AFX_MSG_MAPON_MESSAGE(MM_MCINOTIFY,OnMciNotify)END_MESSAGE_MAP()添加的函数体内容如下:LRESULT CEx123Dlg:OnMciNotify(WPARAM wParam,LPARA
9、M lParam)/如果一个文件播放完毕,则重置两个状态为FALSE/使得用户可以再次播放该文件if(wParam=MCI_NOTIFY_SUCCESSFUL)m_bIsPause=FALSE;m_bIsPlaying=FALSE;return 0;return -1;(6) 为“打开”、“播放”和“停止”3个按钮添加消息处理函数。用类向导分别为3个按钮添加BN_CLICKED消息处理函数如下:void CEx123Dlg:OnButtonOpen() CString filename;MCI_OPEN_PARMS mciOpenParms;DWORD dwError;/利用通用对话框打开一个
10、WAV波形文件static char szFilter="波形音频文件(*.wav)|*.wav|"CFileDialog /(直接接下一行,两行合并为一行)dlg(TRUE,"wav",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);if(dlg.DoModal()=IDOK)filename=dlg.GetPathName();/得到用户选择的文件名if(m_bIsPlaying)/如果正在播放,则先关掉dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE
11、,0,NULL);if(dwError)ShowMCIError(dwError);return;mciOpenParms.lpstrDeviceType="waveaudio"mciOpenParms.lpstrElementName=filename;dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);/(以上两行合并为一行代码)/如果打不开音频设备则报告错误并返回if(dwError)ShowMCIError(dwError
12、);return;/如果打开成功,则取得设备ID值并设置两个状态指示m_MCIDeviceID=mciOpenParms.wDeviceID;m_bIsPause=FALSE;m_bIsPlaying=FALSE;void CEx123Dlg:OnButtonPlay() MCI_PLAY_PARMS mciPlayParms;DWORD dwError;if(!m_bIsPlaying)/处理MM_MCINOTIFY消息的窗口句柄mciPlayParms.dwCallback=(long)GetSafeHwnd();/从头开始播放文件mciPlayParms.dwFrom=0;dwError
13、=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);/(两行合并为一行代码)/如果错误,则显示错误并返回if(dwError)ShowMCIError(dwError);return;if(m_bIsPlaying)if(!m_bIsPause)/若正在播放,先暂停dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL);else/若现在处于暂停,则恢复放音dwError=mciSendCommand(m_MC
14、IDeviceID,MCI_RESUME,0,NULL);if(dwError)/遇到错误返回ShowMCIError(dwError);return;m_bIsPause=!m_bIsPause;/切换放音/暂停状态m_bIsPlaying=TRUE;void CEx123Dlg:OnButtonStop() DWORD dwError;dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);if(dwError)ShowMCIError(dwError);return;m_bIsPause=FALSE;m_bIsPlayin
15、g=FALSE;编译、链接并运行程序。当用户按下“打开”按钮时,弹出“打开”对话框,随意选定某波形文件(.wav)播放。“播放”按钮实现声音的暂停和继续播放。“停止”按钮可以停止播放。“关机”按钮则退出播放程序。2、 BMP位图显示程序(1) 新建一个MFC的SDI工程。名为ex124。(2) 在CEx124view类中添加两个public成员变量:BITMAPINFO* m_pBMI;BYTE* m_pDIBData;在构造函数中对两个变量进行初始化:CEx124View:CEx124View()m_pDIBData=NULL;m_pBMI=NULL; (3) 在工作区ClassView页面
16、中,右键单击CEx124View类,在弹出的菜单中选择Add Member Funcion项,依次添加两个函数BOOL LoadFromFile(LPCTSTR lpszFileName);Viod ShowDIB(CDC* pDC, int nLeft, int nTop, int nWidth, int nHeight);其中,函数LoadFromFile()完成从BMP文件中读入位图,ShowDIB则完成位图的显示。相应的成员函数代码如下:BOOL CEx124View:LoadFromFile(LPCTSTR lpszFileName)CFile file;if(!file.Open(
17、lpszFileName,CFile:modeRead|CFile:typeBinary)AfxMessageBox("打不开文件!");return FALSE;/读入BMP文件头信息BITMAPFILEHEADER bfh;if(file.Read(&bfh,sizeof(bfh)!=sizeof(bfh)AfxMessageBox("读文件出错!");return FALSE;/若不是BMP,则不处理if(bfh.bfType!=0x4d42)/'BM'AfxMessageBox("不是BMP文件!");
18、return FALSE;/读入位图信息头BITMAPINFOHEADER bih;if(file.Read(&bih,sizeof(bih)!=sizeof(bih)AfxMessageBox("读文件出错!");return FALSE;/不是24位真彩色图像,则不予处理if(bih.biBitCount!=24)AfxMessageBox("不是24位真彩色图像!");return FALSE;/为BITMAPINFO结构指针申请内存,由于真彩色位图没有颜色表,/所以其BITMAPINFO = BITMAPINFOHEADERm_pBMI=
19、(BITMAPINFO*)new charsizeof(BITMAPINFOHEADER);if(!m_pBMI)AfxMessageBox("分配内存出错!");return FALSE;/由于前面已将BITMAPINFOHEADER读入了内存,这里只需拷贝一下memcpy(m_pBMI,&bih,sizeof(BITMAPINFOHEADER);/为DIB图像数据指针申请内存DWORD dataBytes=bfh.bfSize-bfh.bfOffBits;/图像数据的字节数m_pDIBData=(BYTE*)new chardataBytes;if(!m_pDI
20、BData)AfxMessageBox("分配内存出错!");delete m_pBMI;return FALSE;/读入位图的图像数据if(file.ReadHuge(m_pDIBData,dataBytes)!=dataBytes)AfxMessageBox("读文件出错!");delete m_pDIBData;delete m_pBMI;return FALSE;file.Close();return TRUE; void CEx124View:ShowDIB(CDC *pDC, int nLeft, int nTop, int nWidth,
21、int nHeight)pDC->SetStretchBltMode(COLORONCOLOR);/设置伸缩拷贝模式StretchDIBits(pDC->GetSafeHdc(),nLeft,/目标矩形左上角X坐标nTop,/目标矩形左上角Y坐标nWidth,/目标矩形的宽度nHeight,/目标矩形的高度0,0,/源矩形左上角X、Y坐标m_pBMI->bmiHeader.biWidth,/源矩形宽度m_pBMI->bmiHeader.biHeight,/源矩形高度m_pDIBData,/位图图像数据的地址m_pBMI,/位图信息结构地址DIB_RGB_COLORS,/标志选项SRCCOPY);/光栅操作码(4) 利用类向导在CEx124View中位ID_FILE_OPEN项添加WM_COMMAND消息映射及响应函数(重载“打开”菜单项)操作如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论