【#第一文档网# 导语】以下是®第一文档网的小编为您整理的《MP3音乐播放器实验报告》,欢迎阅读!
河南科技大学 课 程 设 计 说 明 书 课程名称 面向对象程序课程设计 题 目 MP3仿真程序设计 院 系 电子信息工程学院 班 级 计103 班 学生姓名 指导教师 日 期 2013.3.3~2013.3.17 课程设计任务书 课程设计题目 姓名 组别 组长 1 MP3仿真程序设计 学号 专业班级 同组 成员 指导 教师 通过本课程设计,使学生巩固面向对象程序设计的基本概念、原理和技术,学会课程设使用C++语言进行简单程序的开发,将理论与实际相结合,完成一个小型程序的计目的 设计与实现,并在此基础上强化学生的实践意识,提高其实际动手能力和创新能力。 课程设硬件:装有Windows操作系统的计算机 计环境 软件:Visual C++6.0 任务要求: 1.根据实际MP3的运行状况进行需求分析; 课程设2.抽象MP3运行算法; 计任务3.设计MP3运行程序及人机交互界面; 和要求 4.模块功能满足要求、界面友好、具有一定的健壮性; 5.撰写出符合要求的课程设计报告。 参考 文献 1.郑秋生、吴庆涛,《C/C++程序设计》,北京:电子工业出版社 2.谭浩强 《C++程序设计》,北京:清华大学出版社 时 间 进 度 安 排 序号 1 2 3 4 5 起止日期 3.4-3.5 3.6-3.13 3.14-3.15 3.16 3.17 工 作 内 容 学生熟悉题目背景,查阅资料 学生进行功能模块设计、编码、测试 程序验收 根据设计内容形成课程设计文档,撰写课程设计报告 上交课程设计报告 任课教师: 时间:2013.3.3 课程设计报告文档 题目: MP3仿真程序设计 2 一.引言 1.编写目的: 随着多媒体技术的发展,如何简单方便的播放各类媒体已成为人们普遍关注的问题。本设计就是基于面向对象技术,利用VC++6.0开发制作一个具有自己设计风格的简单的多媒体MP3播放器。该播放器是基于MFC集成开发环境,利用MCIWnd类,建立了一个MP3播放器,通过调用这个类的函数来实现MP3播放器的暂停,播放,上一首,下一首,快进等基本功能。它外观简洁,操作简便,系统资源占用少等功能。通过MP3仿真程序设计,更加深入了解面向对象的编程。通过本课程设计,巩固面向对象程序设计的基本概念、原理和技术,学会使用C++语言进行简单程序的开发,将理论与实际相结合,并在此基础上强化了实践意识,提高其实际动手能力和创新能力。 2.定义: HWND m_PreAudio,m_Audio; bool m_IsPaused,m_IsOpened; 前两个变量用来存储MCIWndCreate返回的窗口句柄,初始值为NULL;后两者分别用来记录文件的播放与暂停状态,初始值分别为true与false; 3.参考资料: 1.郑秋生、吴庆涛,《C/C++程序设计》,北京:电子工业出版社 2.谭浩强 《C++程序设计》,北京:清华大学出版社 二.任务的描述 1.目标: 利用C++编写制作一个MP3播放器。 2.功能描述: 实现添加音乐,播放音乐,上一首,下一首,暂停,关闭播放,删除音乐,快进控制,循环播放,背景添加等功能。 3.性能描述 (1)数据精确度:各种按钮点击之后1秒内都会触发点击事件,其中快进拖动,反应时间在1—2秒。 (2)时间特性:程序2秒内就可以运行。功能按钮1秒内触发点击事件。 4.运行环境: 硬件:装有Windows操作系统的计算机 软件:Visual C++6.0(编译环境) 5.条件与限制: 硬件:装有Windows操作系统的计算机 三.任务设计 1.类的划分: CMyplayerDlg 多媒体播放器主程序。MCIWnd类,实现对音乐文件的添加、播放等控制,CFileDialog 类,打开特定格式的音乐文件,CListBox类,实现音乐歌曲名的列表框显示CFileFind类,对音乐文件的查找等。 2.对各个类的介绍: 3 (1)CMyplayerDlg多媒体播放器主程序 (2)MCIWnd类:MCI,是Media Control Interface的简写,也就是多媒体控制接口.它提供一组标准的命令,用来播放多媒体设备和记录多媒体资源; MCIWnd是一个控制多媒体设备的基于MCI的窗口类,要制作多媒体封面只需创建该类的一个窗口,然后向它发送打开和控制MCI设置的消息。 MCIWnd窗口底部的播放条(Playbar )包括一个播放/暂停(Play/Pause)按键、一个显示菜单(menu)按键和一个用于报告播放进程的标尺。在播放窗口的任何地方单击鼠标右键都会显示一个弹出菜单, 用于调整MCIWnd窗口的大小、MCI多媒体文件的声音、速度的大小、MCI命令等。 备注: MCIWnd并不属于MFC,因此不能从MCIWnd派生类。 MCIWnd类的基本函数(1) MCIWndCreate(hwndParent,hInstance,dwStyle,szFile) 用于创建MCIWnd类的窗口; hwndParent为父窗口句柄(拥有 MCIWnd的窗口) hInstance是程序句柄(通常可以利用AfxGetInstanceHandle()获得程 序句柄) dwStyle定义了MCIWnd的窗口类型 szFile是供播放的MCI文件名,可以是MCI支持的各种类型文件,可以为NULL。 MCIWndCreate()返回MCIWnd的窗口句柄,用于其他MCI Wnd函数。 注意:每次播放都要调用此函数打开设备,结束后要调MCIWndDdetroy (hWnd)关闭设备。 dwStyle的类型: 1.MCIWNDF_常量 MCIWNDF_NOAUTOSIZEWINDOW MCIWNDF_NOPLAYBAR MCIWNDF_NOAUTOSIZEMOVIE MCIWNDF_NOMENU MCIWNDF_SHOWNAME MCIWNDF_SHOWPOS MCIWNDF_SHOWMODE MCIWNDF_SHOWALL 2. WS_窗口类型常量,缺省为WS_CHILD| WS_BORDER|WS_VISIBLE 所有这些函数都使用创建(MCIWndCreate)时获取的HWND句柄作为参 数,返回一个long的值,0代表成功,其它为错误码 ; MCIWndPlay(hWnd) 开始从文件开头播放 ,其参数hWnd为MCIWnd类的一个窗口句柄,也就是 MCIWndCreate函数返回的值; MCIWndPause(hWnd) 实现暂停功能; MCIWndHome(hWnd) 返回至起始位置 ; MCIWndResume(hwnd) 暂停后继续播放; MCIWndStop(hWnd) 停止播放 ; MCIWndDdetroy(hWnd)该函数向窗口发送WM_CLOSE消息,窗口接收到该消息之后,关闭所打开的MCI文件,并关闭窗口。 4 图--播放函数流程图 (3)CFileDialog 类: 作用:打开特定格式的文件 实例化CFileDialog 类的一个对象CFileDialog FileOpenDlg(TRUE,NULL,NULL, OFN_HIDEREADONLY,szFileFilter,CWnd* pointer); TRUE表示建立一个打开文件的对话框,若为FALSE则表示建立“文件保存为”的对话框; 第五个变量指定了过滤的文件类型,本例可以将其设为Mp3格式,即“Mp3 File(*.mp3)|*.mp3|”,其他参看MSDN; 该函数的原型为 CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); (4)CListBox类: 为列表框关联CListBox类的变量m_PlayList; 每次打开文件时都自动将文件添加到列表中,代码如下:if(m_PlayList.FindStringExact(-1,FileName)==LB_ERR) { m_PlayList.AddString(FileName); } m_PlayList.SetCurSel(m_PlayList.FindStringExact(-1,FileName)); 说明:第一个函数查找在列表框中是否存在相同项(参数一为起始位置的索引,参数二为查找的项目),是则返回该列表的索引(从零开始),否则返回LB_ERR;第二个函数用于用于加载列表项;第三个函数使被选项处于高亮度显示状态,其参数为被选项的索引; CListBox相关函数原型 int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const; int AddString( LPCTSTR lpszItem ); int SetCurSel( int nSelect ); int GetSelCount( ) const; int GetCaretIndex( ) const; int GetCurSel( ) const;此两函数功能相似,均为获取当前选择项的索引; int GetText( int nIndex, LPTSTR lpszBuffer ) const; int GetCount( ) const; 5 类5;CFileFind类。 CFileFind类的相关函数 virtual BOOL FindFile( LPCTSTR pstrName = NULL, DWORD dwUnused = 0 ); virtual BOOL FindNextFile( ); virtual CString GetFilePath( ) const; 这三个函数中,前两个函数必须依次序同时调用,且FindNextFile( )在FindFile()之后; GetFilePath( ) 函数调用之前必须先至少一次调用FindNextFile(); 四.编写代码 1.问题1 (1)问题描述:同时播放两首或者多首歌曲。 (2)解决办法:为了避免出现两首歌曲同时播放的现象,我们先判断是否已经有歌曲在播放:是,则停止播放该文件,然后再播放新的文件;否,则直接播放文件; 实现上述功能的基本方法:每次创建MCIWnd窗体时,将返回值同时付给m_PreAudio,m_Audio; 具体代码如下: if(m_Audio == NULL) { m_Audio = m_PreAudio=MCIWndCreate(this->GetSafeHwnd(), AfxGetInstanceHandle(), WS_CHILD|WS_VISIBLE|MCIWNDF_NOMENU,PathName); CString str; str.Format("正在播放:%s",FileName); SetDlgItemText(IDC_STATUS_STATIC,str); m_IsOpened=true; } else { MCIWndHome(m_Audio); } MCIWndPlay(m_Audio); m_IsPaused=false; 2.问题2 (1)问题描述:编写上述程序,编译、运行,会发现在播放一首歌曲的时候,再播放其他歌曲,这时会变得很混乱,多首歌曲同时播放; (2)解决办法:先判断m_IsOpened的值,如m_IsOpened 的值为true,表示有歌曲正在播放,因此要先停止该设备; if(m_IsOpened==true) { MCIWndStop(m_PreAudio); 6 MCIWndDestroy(m_PreAudio); 问题3 (1)问题描述:当列表中有多项时,双击只能播放最后加到列表中的一首,这是因为:每次使用OpenFiles()打开文件时,FileName与PathName均被赋新值,因此在播放Play()时,播放的是最后一次的PathName; (2)解决方法:在Play()函数中,添加如下代码: if(m_PlayList.GetSelCount()==LB_ERR) //得到被选择项的项目总数 { 对于单选择的列表框返回LB_ERR int nIndex;CString str; nIndex=m_PlayList.GetCaretIndex();//得到当前选择项的索引 m_PlayList.GetText(nIndex,str);//获取文本,本例即文件名,赋给str CFileFind FileFind; //实例化CFileFind类的对象 FileFind.FindFile(str,0); //打开文件搜索 FileFind.FindNextFile(); //检查所找到的是否唯一,否,返回非零 PathName=FileFind.GetFilePath();//返回找到文件的路径 m_IsOpened=true; FileName=str; } 3. } 五.运行结果与分析 1.程序运行的过程:程序可以实现音乐的添加,播放,暂停,上一首,下一首,删除,快进等功能,但是,音量调节上的功能由于时间等原因未实现。 2.类的构造顺序:CMyplayerDlg类MCIWnd类,CFileDialog 类, CListBox类, CFileFind类。 3.错误描述及其解决办法 (1)问题1:当没有歌曲时,点击播放会导致程序崩溃。 问题描述:假如列表中没有歌曲,点击播放或者删除的话会导致程序崩溃,因为,之前没有写判断函数,导致程序无法执行,所以崩溃。 解决办法:在播放函数中添加判断列表框是否有音乐,若有,则执行播放,若没有,则提示。代码如下: int length; nIndex=m_PlayList.GetCurSel();//0 nIndex+=1; length=m_PlayList.GetCount();//获取当前列表项数 if(length==0) { m_PreTrack.EnableWindow(false); AfxMessageBox("没有歌曲,请添加播放歌曲!"); m_PreTrack.EnableWindow(true); 7 }else if(m_Audio != NULL) { int i; i=m_PlayList.GetCurSel(); m_PlayList.GetText(i,PathName); m_Audio = m_PreAudio=MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(),WS_CHILD|WS_VISIBLE|MCIWNDF_NOMENU,PathName); CString str; str.Format("正在播放:%s",FileName); SetDlgItemText(IDC_STATUS_STATIC,str); m_IsOpened=true; } (2)问题2 问题描述:如果删除的是最后一首歌曲,则会弹出两次提示框。但是不影响使用,只对用户体验稍微影响。 解决办法:因为删除完当前歌曲后,调用了下一首OnNextTrack()函数,而此函数调用了播放OnPlay()函数,因为在OnNextTrack()和OnPlay()函数中都做了判断列表框是否有歌曲,如果没有则会提示添加歌曲,所以会弹出两次“没有歌曲,请添加歌曲”的提示。对于此问题,对功能影响不大,由于时间有限,所以未做完善。 8 六、感想认识 面向对象编程首先给我们带来了极大的兴趣。可视化的操作给程序设计者提供了很大的便利。经过这一学期VC++的学习,我学到了很多,而且在这一段时间的实际动手学习中,我对VC++这门课程又有了更深刻的认识,基本掌握了用MFC创建基于对话框的应用程序的方法,同时了解了MCI相关知识。这次MP3播放器的设计主要对.mp3音频格式的文件实现播放控制:播放/暂停歌曲、停止播放、上/下首歌曲切换、删除歌曲、添加背景、循环播放、快进等功能;本次设计虽能实现MP3播放器的基本功能,但仍然存在着许多不足,音量的控制始终没有做好,由于时间等原因,最终交程序的时候还是没有调试好对音量的控制。 编程虽然遇到很多问题,过程中苦恼,着急等,但是收获同样是巨大的,在设计中每解决一个问题,那种成就感是无法言语的。编程中遇到的诸多问题,后来经过自己思考,找同学咨询,借助参考书资料以及网络资源,找到了问题所在,进行了多次修改调试之后终于得到了运行结果,这让我感觉到了学会收集资料也是很重要的,可以在这个过程中学到不少知识。在这过程中,老师和同学的帮助还是很大的,特别是老师的指导,能够更加了解到程序的设计等知识的重要性。 最后,通过这次设计,不但学会了如何去利用课本和参考资料,而且提高了设计和制作过程中解决实践问题的能力,把在课堂所学的知识灵活运用,理论联系实际,为以后的学习和工作打下了扎实的基础。其次,提高了自己的分析问题和软件调试能力,同时也大大提高了VC++6.0软件编程的能力,相信这次的收获远远大于做出程序本身。 七.程序代码 略(见电子版) 9 计算机系课程设计指导教师评分表 课程设计题目 姓名 学号 MP3仿真程序设计 专业班级 指导教师评语: 指导教师: 项 目 1设计过程中出勤、学习态度等方面 分 值 20 评 分 要 素 上机出勤及端正的学习态 度、认真刻苦程度等 采用的算法、设计方案,设计结果,界面友好等方面进 行综合评定 能简明扼要地阐述设计的 主要内容,能准确流利地回答各种问题 条理清晰,表述清楚、措词 得当 成 绩 2软件设计质量 40 成绩3 答辩 评定 4设计报告书写 20 10 5 实际动手能力 10 组长全面负责,承担复杂的 模块设计分值就高 总 成 绩 // MusicPlayerDlg.cpp : implementation file // #include "stdafx.h" #include "MusicPlayer.h" #include "MusicPlayerDlg.h" 10 #include "vfw.h" #include "mmsystem.h" #pragma comment(lib,"winmm.lib") #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define pointer CString str; ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 11 { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMusicPlayerDlg dialog CMusicPlayerDlg::CMusicPlayerDlg(CWnd* pParent /*=NULL*/) : CDialog(CMusicPlayerDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMusicPlayerDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMusicPlayerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMusicPlayerDlg) DDX_Control(pDX, IDC_DELETE, m_Delete); DDX_Control(pDX, IDC_CIRCLE, m_Circle); DDX_Control(pDX, IDC_OPENFILES, m_OpenFiles); DDX_Control(pDX, IDC_LIST1, m_PlayList); DDX_Control(pDX, IDC_STOP_BUTTON, m_StopButton); DDX_Control(pDX, IDC_PREVIOUS_TRACK, m_PreTrack); DDX_Control(pDX, IDC_PLAY_BUTTON, m_PlayButton); DDX_Control(pDX, IDC_PAUSE_BUTTON, m_PauseButton); DDX_Control(pDX, IDC_NEXT_TRACK, m_NextTrack); 12 //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMusicPlayerDlg, CDialog) //{{AFX_MSG_MAP(CMusicPlayerDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_PLAY_BUTTON, OnPlay) ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnPause) ON_BN_CLICKED(IDC_STOP_BUTTON, OnStop) ON_BN_CLICKED(IDC_OPENFILES, OnOpenFiles) ON_LBN_SELCHANGE(IDC_LIST1, OnPlayList) ON_BN_CLICKED(IDC_PREVIOUS_TRACK, OnPreviousTrack) ON_BN_CLICKED(IDC_NEXT_TRACK, OnNextTrack) ON_BN_CLICKED(IDC_CIRCLE, OnCircle) ON_BN_CLICKED(IDC_DELETE, OnDelete) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMusicPlayerDlg message handlers BOOL CMusicPlayerDlg::OnInitDialog() { CDialog::OnInitDialog(); m_PlayButton.EnableWindow(false); m_PauseButton.EnableWindow(false); m_StopButton.EnableWindow(false); m_PreTrack.EnableWindow(false); m_NextTrack.EnableWindow(false); m_Delete.EnableWindow(false); m_Circle.EnableWindow(false); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 13 ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // Set big icon // Set small icon CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { } pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); // TODO: Add extra initialization here HWND m_PreAudio, m_Audio; return TRUE; // return TRUE unless you set the focus to a control } void CMusicPlayerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CMusicPlayerDlg::OnPaint() { if (IsIconic()) 14 CDialog::OnSysCommand(nID, lParam); { } CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); else { CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是你自己的图对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CMusicPlayerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } 15 CDialog::OnPaint(); void CMusicPlayerDlg::OnPlay() { // TODO: Add your control notification handler code here int nIndex; CString str; if(m_IsOpened==true) { } int length; nIndex=m_PlayList.GetCurSel();//0 nIndex+=1; length=m_PlayList.GetCount();//获取当前列表项数 if(length==0) { m_PreTrack.EnableWindow(false); AfxMessageBox("没有歌曲,请添加播放歌曲!"); m_PreTrack.EnableWindow(true); MCIWndStop(m_PreAudio,MCI_STOP,0,0); MCIWndDestroy(m_PreAudio,WM_CLOSE,0,0); }else if(m_Audio != NULL) { int i; i=m_PlayList.GetCurSel(); m_PlayList.GetText(i,PathName); m_Audio = m_PreAudio=MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(),WS_CHILD|WS_VISIBLE|MCIWNDF_NOMENU,PathName); CString str; str.Format("正在播放:%s",FileName); SetDlgItemText(IDC_STATUS_STATIC,str); m_IsOpened=true; } else { } MCIWndHome(m_Audio); MCIWndPlay(m_Audio); m_IsPaused=false; } void CMusicPlayerDlg::OnPreviousTrack() 16 { // TODO: Add your control notification handler code here int nIndex;CString str; nIndex=m_PlayList.GetCaretIndex(); if(nIndex==0) m_PreTrack.EnableWindow(false); AfxMessageBox("已经是第一项,请重新选择歌曲!"); m_PreTrack.EnableWindow(true); { } else { } } void CMusicPlayerDlg::OnPause() { // TODO: Add your control notification handler code here //1 //1 } void CMusicPlayerDlg::OnStop() { 17 nIndex-=1; m_PlayList.SetCurSel(nIndex); OnPlay(); if(m_IsPaused) { } //MCIWndResume(m_Audio); str.Format("正在播放:%s",FileName); SetDlgItemText(IDC_STATUS_STATIC,str); //m_IsPaused = false; else { } MCIWndPause(m_Audio); m_IsPaused = true; str.Format("已暂停播放:%s",FileName); SetDlgItemText(IDC_STATUS_STATIC,str); // TODO: Add your control notification handler code here } void CMusicPlayerDlg::OnOpenFiles() { CFileDialog FileOpenDlg(TRUE,NULL,NULL, OFN_HIDEREADONLY,"Mp3 File(*.mp3)|*.mp3|",NULL); //CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR MyMethod() = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); if(IDOK==FileOpenDlg.DoModal()){ PathName.Format("%s",FileOpenDlg.GetPathName()); FileName.Format("%s",FileOpenDlg.GetFileName()); OnPlayList(); } PathName.Format("%s",FileOpenDlg.GetPathName()); FileName.Format("%s",FileOpenDlg.GetFileName()); m_PlayButton.EnableWindow(true); m_PauseButton.EnableWindow(true); m_StopButton.EnableWindow(true); m_PreTrack.EnableWindow(true); m_NextTrack.EnableWindow(true); m_Delete.EnableWindow(true); m_Circle.EnableWindow(true); } void CMusicPlayerDlg::OnPlayList( ) { // TODO: Add your control notification handler code here if(m_PlayList.FindStringExact(-1,FileName)==LB_ERR) 18 MCIWndStop(m_Audio); MCIWndDestroy(m_Audio); { m_PlayList.AddString(FileName); } m_PlayList.SetCurSel(m_PlayList.FindStringExact(-1,FileName)); } void CMusicPlayerDlg::OnDblclkList1() { // TODO: Add your control notification handler code here int a=m_PlayList.GetCurSel(); m_PlayList.GetText(a,PathName); OnPlay(); } void CMusicPlayerDlg::OnNextTrack() { // TODO: Add your control notification handler code here int nIndex; CString str; int length; nIndex=m_PlayList.GetCurSel(); nIndex+=1; length=m_PlayList.GetCount();//获取当前列表项数 if(nIndex==length) //判断是否为最后一首 {m_PlayList.SetCurSel(0); OnPlay();} else m_PlayList.SetCurSel(nIndex); OnPlay(); } BEGIN_EVENTSINK_MAP(CMusicPlayerDlg, CDialog) //{{AFX_EVENTSINK_MAP(CMusicPlayerDlg) // VTS_PI2) ON_EVENT(CMusicPlayerDlg, IDC_MMCONTROL1, 38 /* Done */, OnMmcontrol1, //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() 19 void CMusicPlayerDlg::OnCircle() { // TODO: Add your control notification handler code here } void CMusicPlayerDlg::OnDelete() { // TODO: Add your control notification handler code here int nIndex;CString str; nIndex=m_PlayList.GetCaretIndex();//得到当前选择项的索引 m_PlayList.DeleteString(nIndex); OnNextTrack(); } 20 本文来源:https://www.dywdw.cn/32da28f475eeaeaad1f34693daef5ef7ba0d121e.html