【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《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.wddqxz.cn/32da28f475eeaeaad1f34693daef5ef7ba0d121e.html