MP3音乐播放器实验报告

2022-09-15 15:02:35   第一文档网     [ 字体: ] [ 阅读: ] [ 文档下载 ]
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。下载word有问题请添加QQ:admin处理,感谢您的支持与谅解。点击这里给我发消息

#第一文档网# 导语】以下是®第一文档网的小编为您整理的《MP3音乐播放器实验报告》,欢迎阅读!
播放器,实验,报告,音乐,MP3



河南科技大学



课程名称 面向对象程序课程设计 MP3仿真程序设计







电子信息工程学院 103 学生姓名 指导教师 2013.3.32013.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_PreAudiom_Audio;

bool m_IsPausedm_IsOpened;

前两个变量用来存储MCIWndCreate返回的窗口句柄,初始值为NULL;后两者分别用来记录文件的播放与暂停状态,初始值分别为truefalse 3.参考资料:

1.郑秋生、吴庆涛,C/C++程序设计》,北京:电子工业出版社 2.谭浩强 C++程序设计》,北京:清华大学出版社

二.任务的描述

1.目标

利用C++编写制作一个MP3播放器。 2.功能描述:

实现添加音乐,播放音乐,上一首,下一首,暂停,关闭播放,删除音乐,快进控制,循环播放,背景添加等功能。 3.性能描述

1)数据精确度:各种按钮点击之后1秒内都会触发点击事件,其中快进拖动,反应时间在12秒。

2)时间特性:程序2秒内就可以运行。功能按钮1秒内触发点击事件。 4.运行环境

硬件:装有Windows操作系统的计算机 软件:Visual C++6.0(编译环境) 5.条件与限制:

硬件:装有Windows操作系统的计算机

三.任务设计

1.类的划分

CMyplayerDlg 多媒体播放器主程序。MCIWnd类,实现对音乐文件的添加、播放等控制,CFileDialog 类,打开特定格式的音乐文件,CListBox类,实现音乐歌曲名的列表框显示CFileFind类,对音乐文件的查找等。 2.对各个类的介绍

3




1CMyplayerDlg多媒体播放器主程序 2MCIWnd类:MCI,Media Control Interface的简写,也就是多媒体控制接口.它提供一组标准的命令,用来播放多媒体设备和记录多媒体资源;

MCIWnd是一个控制多媒体设备的基于MCI的窗口类,要制作多媒体封面只需创建该类的一个窗口,然后向它发送打开和控制MCI设置的消息。

MCIWnd窗口底部的播放条(Playbar )包括一个播放/暂停(Play/Pause)按键、一个显示菜单(menu)按键和一个用于报告播放进程的标尺。在播放窗口的任何地方单击鼠标右键都会显示一个弹出菜单, 用于调整MCIWnd窗口的大小、MCI多媒体文件的声音、速度的大小、MCI命令等。

备注: MCIWnd并不属于MFC,因此不能从MCIWnd派生类。 MCIWnd类的基本函数(1)

MCIWndCreate(hwndParent,hInstancedwStyle,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) 开始从文件开头播放 其参数hWndMCIWnd类的一个窗口句柄,也就是 MCIWndCreate函数返回的值; MCIWndPause(hWnd) 实现暂停功能; MCIWndHome(hWnd) 返回至起始位置 MCIWndResume(hwnd) 暂停后继续播放; MCIWndStop(hWnd) 停止播放

MCIWndDdetroy(hWnd)该函数向窗口发送WM_CLOSE消息,窗口接收到该消息之后,关闭所打开的MCI文件,并关闭窗口。

4




--播放函数流程图



3CFileDialog 类:

作用:打开特定格式的文件

实例化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 );

4CListBox类:

为列表框关联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






5CFileFind类。

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_PreAudiom_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()打开文件时,FileNamePathName均被赋新值,因此在播放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类的构造顺序:CMyplayerDlgMCIWnd类,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

相关推荐
推荐阅读