手把手教您用MFC做MP3音乐播放器
- 格式:doc
- 大小:568.50 KB
- 文档页数:29
基于MFC运用windows media player控件实现的多媒体播放器设计平台PC(windows 7 x64),Visual C++ 6.0设计框图一.工程创建本程序基于MFC的对话框模式,起名为MediaPlayer。
二. 添加Windows Media Player 控件在对话框的空白处点击右键选择“Insert ActiveX control”,在弹出的对话框中找到Windows Media Player。
(因为Win7系统中没有ActiveMovieControl控件所以就用以上控件代替了。
)三.为Windows Media Player 控件设置变量在已经添加好的控件上单击右键选择“ClassWizard”,在弹出的窗口中切换到“Member Variables”一栏,找到刚刚添加的控件的ID,选中它然后在右侧的按钮中点击“Add Variables”,然后如图所示:这样就添加成功了。
此时在源文件的对话框中,系统会自动生成必需的媒体实现文件。
四.播放器界面设计设计的界面如下图所示,其中播放控制按钮有打开文件,播放,暂停,停止,快退,快进,播放列表,全屏,退出,关于。
然后还有音量控制,播放模式,播放进度,列表选项的相关控制器件。
控件ID与变量关联如下:控件ID 变量类型变量名称WMPlayer IDC_OCX1 CWMPPlayer4 m_playerListControl IDC_LIST1 CListCtrl m_listCtrlSlider IDC_SLIDER1 CSliderCtrl m_scheduleSlider IDC_SLIDER2 CSliderCtrl m_VOLUME Radio Button IDC_ORDER int m_order 按钮控件的ID和对应的响应函数名称如下:控件名称ID 响应函数名称打开文件IDC_OPEN OnOpen()播放IDC_PLAY OnPlay()暂停IDC_PAUSE OnPause()停止IDC_STOP OnStop()快退IDC_REVERSE OnReverse()快进IDC_FORWARD OnForward()播放列表IDC_PLAYLIST OnPlayList()全屏IDC_FULLSCREEN OnFullScreen()退出IDC_EXIT OnExit()- IDC_SUB OnSub()+ IDC_ADD OnAdd()上一曲IDC_LAST OnLast()下一曲IDC_NEXT OnNext()关于IDC_ABOUT OnAbout()静音IDC_SILENCE OnSlience() 选中项上移IDC_LISTCHOOSEUP OnListchooseup()选中项下移IDC_LISTCHOOSEDOWN OnListchoosedown()删除选中项IDC_LISTCHOOSEDELETE OnListchoosedelet()删除所有项IDC_LISTDELETEALL OnListdeleteall()导入列表IDC_LISTIMPORT OnListimport()导出列表IDC_LISTEXPORT OnListexport() 五.功能实现(1)播放控制Windows Media Player 控件初始化在添加该控件的时候自动生成的多个库文件,不同的文件实现播放器各个方面的功能,所以需要我们手动将他们联系起来。
MFC播放MP3工程中添加 Winmm.lib stdafx.h 里面添加包含 Mmsystem.h 使用mciSendCommand函数播放MP3#include <windows.h>#include "resource.h"#pragma comment(lib, "winmm")LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARA M );int MP3Player(HWND,int fnNum);HINSTANCE Hinstance;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPr evInstance,LPSTR lpCmdLine,int nShowCmd){WNDCLASS wndclass;HWND hwnd;MSG msg;WCHAR *title=L"快乐の小②B制作";WCHAR *MP3=L"MP3 Player";Hinstance=hInstance;wndclass.cbClsExtra=NULL;wndclass.cbWndExtra=NULL;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE _BRUSH);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);wndclass.hInstance=hInstance;wndclass.lpfnWndProc=WndProc;wndclass.lpszClassName=MP3;wndclass.lpszMenuName=0;wndclass.style=CS_HREDRAW |CS_VREDRAW;if(!RegisterClass(&wndclass)){MessageBox(NULL,L"注册窗口失败!",L"Error Info",MB_OK);return 0;}hwnd=CreateWindowEx(WS_EX_LAYERED,MP3,title,WS_OVE RLAPPED | WS_CAPTION | WS_SYSMENU| WS_MINIMIZEBOX ,CW_USEDEFAULT,CW_USEDEFAULT,310,410,NULL,NULL,hIns tance,NULL);AnimateWindow(hwnd,1000,AW_BLEND|AW_SLIDE);//窗口效果函数//UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){PAINTSTRUCT ps;HDC hdc,hdcmem;HBITMAP hBitmap;BITMAP Bitmap;static HWND ChildHwnd_1=0;static HWND ChildHwnd_2=0;if(message == WM_PRINT || message == WM_PRINTCLIENT) {hdc=(HDC)wParam;hBitmap=LoadBitmap(Hinstance,MAKEINTRESOURCE(IDB_B ITMAP1));GetObject(hBitmap,sizeof(BITMAP),&Bitmap);hdcmem=CreateCompatibleDC(hdc);SelectObject(hdcmem,hBitmap);BitBlt(hdc,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hdcmem,0 ,0,SRCCOPY);DeleteDC(hdcmem);}switch(message){case WM_CREATE:ChildHwnd_1=CreateWindowEx(WS_EX_LAYERED,L"Button", L"Play",WS_VISIBLE|WS_CHILD,50,330,70,30,hwnd,(HMENU)1,0, NULL);ChildHwnd_2=CreateWindowEx(WS_EX_LAYERED,L"Button", L"Stop",WS_VISIBLE|WS_CHILD,190,330,70,30,hwnd,(HMENU)2,0 ,NULL);return 0;case WM_CLOSE:DestroyWindow(hwnd);PostQuitMessage(0);return 0;case WM_COMMAND:switch(wParam){case 1:MP3Player(hwnd,1);break;case 2:MP3Player(hwnd,2);break;}return 0;case WM_PAINT:hBitmap=LoadBitmap(Hinstance,MAKEINTRESOURCE(IDB_B ITMAP1));GetObject(hBitmap,sizeof(BITMAP),&Bitmap);hdc=GetDC(hwnd);hdcmem=CreateCompatibleDC(hdc);SelectObject(hdcmem,hBitmap);BitBlt(hdc,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hdcmem,0 ,0,SRCCOPY);DeleteDC(hdcmem);BeginPaint(hwnd,&ps);EndPaint(hwnd,&ps);return 0 ;}return DefWindowProc(hwnd,message,wParam,lParam);}int MP3Player(HWND hwnd,int fnNum){switch(fnNum){case 1://播放static MCI_OPEN_PARMS open;static MCI_PLAY_PARMS play;static MCIDEVICEID MP3ID;open.dwCallback=0;open.lpstrAlias=NULL;open.lpstrDeviceType=L"MPEG"; //MP3设备open.lpstrElementName=L"该死的温柔.mp3"; //要播放的文件open.wDeviceID=0;mciSendCommand(0,MCI_OPEN,MCI_WAIT| MCI_OPEN_ELE MENT,(DWORD)(LPMCI_OPEN_PARMS)&open);//初始化MP3ID=open.wDeviceID;play.dwCallback=(DWORD)hwnd; //播放程序的窗口句柄play.dwFrom=0;play.dwTo=0;mciSendCommand(MP3ID,MCI_PLAY,MCI_NOTIFY,(DWORD) (LPMCI_OPEN_PARMS)&play);return 0;case 2://停止MCI_GENERIC_PARMS close;close.dwCallback=(DWORD)hwnd;mciSendCommand(MP3ID,MCI_CLOSE,MCI_NOTIFY,(DWOR D) (LPMCI_GENERIC_PARMS)&close);return 0;}return 0;}。
课程设计说明书课程设计名称:软件综合课程设计课程设计题目:音频播放器程序的设计与实现学院名称:信息工程学院电子信息工程专业课程设计任务书正文:目录引言 (5)一、设计程序的目的与要求 (6)目的 (6)要求 (6)二、方案实现与调试 (6)总体设计 (6)1、实现功能 (6)2、功能模块图 (7)详细设计 (7)1、界面布局 (7)2、各模块功能设计 (8)2.1处理“打开”按钮 (9)2.2处理“播放”按钮 (9)2.3处理“暂停”按钮 (9)2.4处理“停止”按钮 (9)2.5处理“音量”按钮 (10)2.6处理“退出”按钮 (10)3 操作步骤 (10)三、课程设计分析与总结 (11)分析 (11)总结 (11)附录 (13)关键程序清单 (13)参考文献 (20)引言MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC 的基本知识而设计的。
1.1 MFC简介MFC是Visual C++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard 向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。
这些函数,必须通过类定义对象才能使用[1]。
1.2 MCI简介MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。
它所支持的媒体格式包括mp3、avi、wav、mpeg等等[2]。
音频技术发展较早,几年前一些技术已经成熟并产品化,音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。
打开vc6.0,建立如图所示mfc工程文件选择基于对话框的确定删除所有空间,建立如图所示对话框属性如下:播放IDC_open;添加IDC_fileopen;暂停IDC_pause;删除IDC_del;停止IDC_stop;退出IDC_exit;音乐名编辑框IDC_filename;音量控制滑块IDC_SLIDER1;音量控制编辑框IDC_vol;建立类向导对应如下:在onpaint函数下添加代码void CMp3Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.DrawIcon(x, y, m_hIcon);}else{//CDialog::OnPaint();CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP6); /IDB_BITMAP6是你的位图地址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);}}编译运行,你就会看到背景有图片了。
一、软件说明:功能说明:一个简易小巧的MP3播放器,可以播放已经下载好的MP3格式的音乐。
解决什么样的实际问题:市场上的音乐播放器大都占用资源比较大,而且需要联网,即使播放本地音乐,也会占用较多的网速,而这款播放器解决了这些问题。
(虽然还是有很多缺陷,但用起来还是比较方便的。
)性能说明:可以播放单首或多首歌曲,可以保存或清空当前播放列表,支持列表循环,顺序播放,单曲循环。
(但目前只支持MP3格式。
)程序类型说明:这个播放器是winform应用程序。
二、软件设计软件整体结构图及模块划分:软件整体结构图:控制模块:歌曲列表显示区:在VS的“解决方案资源管理器”中的文件说明:整个项目的文件如下:其中,Properties中所包含的的文件有:这里包含的是定义程序集属性的文件,用来设定生成的有关程序集的常规信息dll文件的一些参数。
引用中包含的文件有:这里包含的是这个项目所用的的一些类库信息。
Form1.cs中包含有:这些是窗体的设计信息,而Program.cs是整个源程序的入口。
各模块对应的主要对象或方法:控制模块中主要用到的是axWindowsmediaPlayer控件以及MenuStrip控件。
其中Windows media Player 控件用到的方法属性主要有:axWindowsMediaPlayer1.BeginInit(); //初始化axWindowsMediaPlayer1.settings.autoStart; //自动播放axWindowsMediaPlayer1.settings.setMode("shuffle", false); //顺序播放axWindowsMediaPlayer1.settings.enableErrorDialogs;axWindowsMediaPlayer1.settings.balance;axWindowsMediaPlayer1.settings.mute;axWindowsMediaPlayer1.settings.volume;MenuStrip控件用到的方法事件有:privatevoid打开文件ToolStripMenuItem1_Click(object sender, EventArgs e);privatevoid添加歌曲ToolStripMenuItem_Click(object sender, EventArgs e);privatevoid添加文件夹ToolStripMenuItem_Click(object sender, EventArgs e);privatevoid退出ToolStripMenuItem_Click(object sender, EventArgs e); privatevoid清空列表ToolStripMenuItem1_Click(object sender, EventArgs e);privatevoid顺序播放ToolStripMenuItem_Click(object sender, EventArgs e);privatevoid单曲循环ToolStripMenuItem_Click(object sender, EventArgs e);privatevoid随机播放ToolStripMenuItem_Click(object sender, EventArgs e);数据库设计或数据文件说明:由于播放器使用数据量较小,故采用TXT保存歌曲文件列表。
基于Visual C++6.0的声音文件操作——写自己的播放器三、声音文件的声音数据的读取操作操作声音文件,也就是将WAVE文件打开,获取其中的声音数据,根据所需要的声音数据处理算法,进行相应的数学运算,然后将结果重新存储与WAVE格式的文件中去。
可以使用CFILE类来实现读取操作,也可以使用另外一种方法,拿就是使用Windows提供的多媒体处理函数(这些函数都以mmino打头)。
这里就介绍如何使用这些相关的函数来获取声音文件的数据,至于如何进行处理,那要根据你的目的来选择不同的算法了。
WAVE文件的操作流程如下:1.调用mminoOpen函数来打开WAVE文件,获取HMMIO类型的文件句柄;2.根据WAVE文件的结构,调用mmioRead、mmioWrite和mmioSeek 函数实现文件的读、写和定位操作;3.调用mmioClose函数来关闭WAVE文件。
下面的函数代码就是根据WAVE文件的格式,实现了读取双声道立体声数据,但是在使用下面的代码过程中,注意需要在程序中链接Winmm.lib库,并且包含头文件"Mmsystem.h"。
//获取声音文件数据的函数,pString参数指向要打开的声音文件;{if (pString==NULL)return NULL;HMMIO file1;//定义HMMIO文件句柄;file1=mmioOpen((LPSTR)pString,NULL,MMIO_READWRITE);//以读写模式打开所给的WAVE文件;if(file1==NULL){MessageBox("WAVE文件打开失败!");Return NULL;}char style[4];//定义一个四字节的数据,用来存放文件的类型;mmioSeek(file1,8,SEEK_SET);//定位到WAVE文件的类型位置mmioRead(file1,style,4);if(style[0]!='W'||style[1]!='A'||style[2]!='V'||style[3]!='E')//判断该文件是否为"WAVE"文件格式{MessageBox("该文件不是WAVE格式的文件!");Return NULL;}PCMWAVEFORMAT format; //定义PCMWAVEFORMAT结构对象,用来判断WAVE文件格式;mmioSeek(file1,20,SEEK_SET);//对打开的文件进行定位,此时指向WAVE文件的PCMWAVEFORMAT结构的数据;mmioRead(file1,(char*)&format,sizeof(PCMWAVEFORMAT));//获取该结构的数据;if(format.wf.nChannels!=2)//判断是否是立体声声音;{MessageBox("该声音文件不是双通道立体声文件");return NULL;}mmioSeek(file1,24+sizeof(PCMWAVEFORMAT),SEEK_SET);//获取WAVE文件的声音数据的大小;long size;mmioRead(file1,(char*)&size,4);BYTE *pData;pData=(BYTE*)new char[size];//根据数据的大小申请缓冲区;mmioSeek(file1,28+sizeof(PCMWAVEFORMAT),SEEK_SET);//对文件重新定位;mmioRead(file1,(char*)pData,size);//读取声音数据;mmioClose(file1, MMIO_FHOPEN);//关闭WAVE文件;return pData;}四、使用MCI方法操作声音文件WAVE声音文件一个最基本的操作就是将文件中的声音数据播放出来,用Windows提供的API函数BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound)可以实现小型WAV文件的播放,其中参数lpszSound 为所要播放的声音文件,fuSound为播放声音文件时所用的标志位。
VBA播放MP3歌曲的代码可以用来做背景音乐。
使用方法:打开word、excel等然后按Alt+F11 在打开的窗口中粘贴下面代码:Private Declare Function m ciS endString Lib "winmm.dll" Alias "mciSendStringA" (ByV al lpstrCommand As String, ByV al lpstrReturnString As String, ByV al uReturnLength As Long, ByV al hwndCallback As Long) As LongDim sMCI As String * 255Dim sMP3Dim iNum As IntegerPublic Function Blank(ByV al szString As String) As StringDim l As Integerl = InStr(szString, Chr(0))If l > 0 ThenBlank = Left(szString, l - 1)ElseBlank = szStringEnd IfEnd FunctionPrivate Sub CommandButton1_Click()mciSendString "close OpenFile", 0&, 0, 0End SubPrivate Sub CommandButton2_Click()mciSendString "status OpenFile mode", sMCI, 255, 0If Blank(sMCI) <> "playing" ThenmciSendString "close OpenFile", 0&, 0, 0mciSendString "open """ & "D:\aw\情非得已.mp3"" alias OpenFile type MPEGVideo", 0&, 0, 0mciSendString "play OpenFile", 0&, 0, 0iNum = iNum + 1'If iNum > UBound(sMP3) Then Timer1.Enabled = FalseEnd IfEnd Sub在文档中添加两个按钮控件就行了。
实验2简单音频播放器程序实现1.上机实验报告二等文 四、实验内容用 MFC 设计具有一般能播放 *mp3,*wma,*mdi,*wav,*avi,*dat 件,还有具有播放、暂停、停止、音量调节等功能。
1、 点击“打开”,添加播放资源2、 单击“播放”,开始播放3、 点击“暂停”,暂停播放;之后点击“恢复”,播放器继续播放4、 单击“终止”,音乐播放停止5、滑动音量滑块调节音量大小五、调试过程及实验结果本次作业参考了优酷上的指导视频,然后仿照编写的。
在完成此次大作业的过程中遇到了很多问题,首先音量控制就是一个难点,最初完成的版本可以运行但音量无法控制,后来添加了一个函数解决问题:void CMUSIC_PLAYER_100511217Dlg::0 nCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult){UpdateData(true);m_vol=m_slider.GetPos()/10;SetVolu mn (m_slider.GetPos());UpdateData(false); *pResult = 0;}最终成果:过完成这个简易的音乐播放器,掌握到了MFC编程的基本方法,使自己的编程能力得到进一步的提高,学会使用DirectSound实现音频播放程序的方法。
// DDX/DDV support#un def THIS_FILEstatic char THIS_FILE[] = __FILE__;#en difHWND m_hWnd;MCI_OPEN_PARMS mciope nparms;DWORD ItemLe ngth,ltemTo;DWORD item;/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data〃{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };〃}}AFX_DATA// ClassWizard gen erated virtual fun ctio n overrides〃{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExcha nge(CDataExcha nge* pDX);//}}AFX_VIRTUAL// Impleme ntati onprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExcha nge(CDataExcha nge* pDX){CDialog::DoDataExcha nge(pDX);〃{{AFX_DATA_MAP(CAboutDlg)〃}}AFX_DATA_MAPmciSe ndComma nd(mciope nparms.wDevicelD,MCI_SETAUDIO,MCI_DGV_SETAUDIO_ VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&m cisetvolume);return 0;} void CMyDlg::O nabout()GetDlgltem(IDC_pause)->E nableWi ndow(true);GetDlgltem(IDC_stop)->E nableWi ndow(true); }Stop();m_process.SetPos(0);KillTimer(O);// TODO: Add your con trol no tificati on han dler code here}void CMyDlg::O nCustomdrawvolslider(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your con trol no tificati on han dler code hereUpdateData(true);m_in t=m_c on trolvol.GetPos()/15;setvolume(m_c on trolvol.GetPos());UpdateData(false);*pResult = 0;}16 / 16。
MFC音乐播放器傻瓜教程代码下载地址1、建立工程 ..................................................................... .. (2)1、建立一个MFC工程,命名为Tao_Music ..............................................................32、选择为基本对话框 ..................................................................... .. (3)、包含WindowsSockts ................................................................. ........................... 4 34、使用静态链接库[方便一会直接生成的exe文件单独可以发布] (5)2、搭建界面...................................................................... (5)1、拖入控件: .................................................................... (5)2、控件拖入并摆好 ..................................................................... . (6)3、控件属性设置: .................................................................... ............................. 7 3、写代码实现功能 ..................................................................... . (15)1、变量绑定: .................................................................... . (15)2、加入图片资源 ..................................................................... .. (16)3、新建mp3类: .................................................................... .. (17)4、修改Tao_MusicDlg.h.......................................................... (20)5、修改Tao_Music.cpp........................................................... . (21)6、功能实现: .................................................................... . (32)7、加一个TImer消息使时间跑起来~ ..................................................................... .39、给音量控制滑块加消息,使音量控制实现 ...........................................................42 8 编译运行完工~ ..................................................................... .. (43)1、建立工程1、建立一个MFC工程,命名为Tao_Music2、选择为基本对话框3、包含Windows Sockts[因为要用网络功能]4、使用静态链接库 [方便一会直接生成的exe文件单独可以发布]2、搭建界面1、拖入控件:拖入7个用于播放控制的button,一个picture控件,一个控制音量的滑块。
前言:音乐播放器其实我在大一的时候就用非常生硬的语法写出过一个非常简陋的播放器。
这次写的这个是以前那个的加强版。
虽然说还是有很多bug,而且我至今不知道那些BUG是什么地方的问题。
先给个截图吧,播放器的界面:其实看着还是有那么回事的。
恩,其实除了波形和在线下载的话,功能和酷狗,以及千千静听等播放器的功能是一样的。
音乐播放器的关键是播放音乐,所以第一步是要设计一个类,这个类拥有各种各样的播放音乐的能力。
我设计的类名字叫Playerclass Player{public:Player();virtual ~Player();void Play();//播放函数void Pause();//暂停函数void Stop();//停止函数void Jump(DWORD pos);//这个函数是用来通过直接拖动进度条,然后播放从歌曲的相应位置播放的函数void Read(CString str);//这个函数必须在所有函数的前面调用,他有一个传入参数,是指MP3文件的路径void SetVolume(DWORD vol);//音量大小的设定。
这个不难MCI_STATUS_PARMS GetMode();//这个比较关键,是获得当前的播放状态(一首歌是否播放完了就是靠他)MCI_STATUS_PARMS GetNow();//当前是播放的歌曲第几分第几秒?可以用来改变时间栏和进度条MCI_STATUS_PARMS GetLenth();//获得歌曲的长度。
(时间)private:MCI_PLAY_PARMS m_play;MCI_OPEN_PARMS m_open;MCIDEVICEID m_dID;HWND m_parent;MCI_STATUS_PARMS m_status;MCI_SEEK_PARMS m_seek;MCI_STATUS_PARMS m_mode;};各个函数(可以作为以后MCI函数的查阅手册)实现方法是:void Player::Read(CString str){m_dID=NULL;m_open.lpstrElementName=str;mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&m_o pen);//MCI打开文件m_dID=m_open.wDeviceID;}void Player::Play(){m_play.dwCallback=(DWORD)m_parent;mciSendCommand(m_dID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&m_play);//播放.....下面就不写注释了}void Player::Pause(){mciSendCommand(m_dID,MCI_PAUSE,NULL,NULL);void Player::Stop(){mciSendCommand(m_dID,MCI_CLOSE,NULL,NULL);m_status.dwReturn=0;}MCI_STATUS_PARMS Player::GetLenth(){m_status.dwItem=MCI_STATUS_LENGTH;mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_s tatus);return m_status;}MCI_STATUS_PARMS Player::GetNow(){m_status.dwItem=MCI_STATUS_POSITION;mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_s tatus);return m_status;}MCI_STATUS_PARMS Player::GetMode(){m_mode.dwItem=MCI_STATUS_MODE;mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_ mode);return m_mode;}void Player::Jump(DWORD pos){m_seek.dwTo=pos;mciSendCommand(m_dID,MCI_SEEK,MCI_TO|MCI_WAIT,(DWORD)(LPVOID)&m_seekmciSendCommand(m_dID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&m_play);}void Player::SetVolume(DWORD vol){MCI_DGV_SETAUDIO_PARMS mcivol;mcivol.dwCallback=(DWORD)m_parent;mcivol.dwItem=MCI_DGV_SETAUDIO_VOLUME;mcivol.dwValue=vol;mciSendCommand(m_dID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_ SETAUDIO_ITEM,(DWORD)(LPVOID)&mcivol);}基本上都是运用mciSendCommand这个函数,传入不同的参数,就可以达到不同的效果。
打开vc6.0,建立如图所示mfc工程文件选择基于对话框的确定删除所有空间,建立如图所示对话框属性如下:播放IDC_open;添加IDC_fileopen;暂停IDC_pause;删除IDC_del;停止IDC_stop;退出IDC_exit;音乐名编辑框IDC_filename;音量控制滑块IDC_SLIDER1;音量控制编辑框IDC_vol;建立类向导对应如下:在工程文件,右键,插入,bitmap位图引入你想插入的背景图,必须是bmp格式的进入你的dlg.cpp文件在onpaint函数下添加代码void CMp3Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.DrawIcon(x, y, m_hIcon);}else{//CDialog::OnPaint();CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP6); /IDB_BITMAP6是你的位图地址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);}}编译运行,你就会看到背景有图片了。
插入-类,找到geneticclass,类名mp3.cpp你会发现在头文件中多了一个mp3.h文件在mp3.h文件中添加代码如下// Mp3.h: interface for the Mp3 class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_MP3_H__20D325E5_A96A_43FE_A485_92F57C68DD0D__INCLUDED_)#define AFX_MP3_H__20D325E5_A96A_43FE_A485_92F57C68DD0D__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "Mmsystem.h"class Mp3{public:Mp3();virtual ~Mp3();HWND m_hWnd; //¼Ç¼µ±Ç°´°¿ÚµÄ¾ä±úDWORD DeviceID;//Ö¸¶¨²¥·ÅÒôÀÖµÄÉ豸IDMCI_OPEN_PARMS mciopenparms; //Ö¸¶¨´ò¿ªÒôÀÖÎļþµÄ²ÎÊývoid Load(HWND hwnd,CString Strfilepath);DWORD getinformation(DWORD item);void Play();void Pause();void resum();void Stop();};#endif // !defined(AFX_MP3_H__20D325E5_A96A_43FE_A485_92F57C68DD0D__INCLUDED_) 在mp3.cpp中添加如下代码// Mp3.cpp: implementation of the Mp3 class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Mp3²¥·ÅÆ÷.h"#include "Mp3.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////Mp3::Mp3(){}Mp3::~Mp3(){}void Mp3::Load(HWND hwnd,CString Strfilepath){m_hWnd=hwnd;mciSendCommand(DeviceID,MCI_CLOSE,0,0); //¼ÓÔØÎļþǰÏÈÇå³ýÉÏ´ÎÉèÖÃmciopenparms.lpstrElementName=Strfilepath;//½«ÒôÀÖÎļþ·¾¶´«¸øÉ豸DWORD dwReturn;if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPV OID)&mciopenparms)){//Èç¹û´ò¿ªÊ§°Ü£¬½«³ö´íÐÅÏ¢´æÔÚbuffer²¢ÏÔʾ³ö´í¾¯¸æchar buffer[256];mciGetErrorString(dwReturn,buffer,256);MessageBox(hwnd,buffer,"³ö´í¾¯¸æ",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);}DeviceID=mciopenparms.wDeviceID; //¶àýÌåÉ豸ÀàÐͱàºÅ}DWORD Mp3::getinformation(DWORD item){//MCI½Ó¿Ú¶ÔÏóµÄ״̬MCI_STATUS_PARMS mcistatusparms;//´ý»ñÈ¡µÄÏîÄ¿mcistatusparms.dwItem=item;mcistatusparms.dwReturn=0;//Ïë¶àýÌåÉ豸·¢ËÍÖ¸Á»ñÈ¡µ±Ç°µÄ״̬²ÎÊýmciSendCommand(DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);return mcistatusparms.dwReturn;}void Mp3::Play(){MCI_PLAY_PARMS mciplayparms;mciplayparms.dwCallback=(DWORD)m_hWnd;mciplayparms.dwFrom=0; //ÿ´Î´ÓÍ·²¥·ÅmciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mcipla yparms);}void Mp3::Pause(){mciSendCommand(DeviceID,MCI_PAUSE,0,0);}void Mp3::resum(){mciSendCommand(DeviceID,MCI_RESUME,0,0);}void Mp3::Stop(){mciSendCommand(DeviceID,MCI_STOP,0,0);mciSendCommand(DeviceID,MCI_CLOSE,0,0);}在dlg.cpp文件的public中添加一行代码:int hour,minute,second;在CMp3Dlg::CMp3Dlg(CWnd* pParent /*=NULL*/)中添加如下CMp3Dlg::CMp3Dlg(CWnd* pParent /*=NULL*/): CDialog(CMp3Dlg::IDD, pParent){//{{AFX_DATA_INIT(CMp3Dlg)m_int = 0;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);hour=0;minute=0;second=0;}dlg.cpp中头文件如下:#include "stdafx.h"#include "Mp3²¥·ÅÆ÷.h"#include "Mp3²¥·ÅÆ÷Dlg.h"#include "Mmsystem.h"#include "Digitalv.h"#include "Mp3.h" //ÒôÁ¿¿ØÖÆÓõ½#pragma comment(lib,"Winmm.lib")#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif在对话框中双击添加添加onfileopen函数,代码如下void CMp3Dlg::Onfileopen(){char filefiler[]="mp3文件(*.mp3)|*.mp3|""wma文件(*.wma)|*.wma|""wav文件(*.wav)|*.wav|";CFileDialogdlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,filefile r);if (dlg.DoModal()==IDOK){CString strfilepath=dlg.GetPathName();CString strfilename=dlg.GetFileName();SetDlgItemText(IDC_filename,strfilename);CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(280,128,mtime);Mp3 mp3;mp3.Load(this->m_hWnd,strfilepath);GetDlgItem(IDC_open)->EnableWindow(TRUE);GetDlgItem(IDC_pause)->EnableWindow(TRUE);GetDlgItem(IDC_stop)->EnableWindow(TRUE);GetDlgItem(IDC_del)->EnableWindow(TRUE);m_list.InsertString(m_list.GetCount(),strfilename);//获取文件名m_list.SetCurSel(m_list.GetCount()-1);}双击播放,进入代码,添加如下void CMp3Dlg::Onopen(){CString strfilename;int index=m_list.GetCurSel();CString mtime;CClientDC dc(this);Mp3 mp3;hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(280,128,mtime);if(index==-1){MessageBox("请添加音乐");return;}m_list.GetText(index,strfilename);SetDlgItemText(IDC_filename,strfilename);mp3.Stop();mp3.Load(this->m_hWnd,strfilename);mp3.Play();SetTimer(0,1000,NULL);}同理,暂停,停止,删除,退出代码如下void CMp3Dlg::Onpause(){// TODO: Add your control notification handler code here CString strtemp;Mp3 mp3;GetDlgItemText(IDC_pause,strtemp);//获取按钮状态if (pare("暂停")==0){mp3.Pause();SetDlgItemText(IDC_pause,"继续");KillTimer(0);//取消计数器的显示}if (pare("继续")==0){mp3.resum();SetTimer(0,1000,NULL);SetDlgItemText(IDC_pause,"暂停");}}void CMp3Dlg::Onstop(){// TODO: Add your control notification handler code here Mp3 mp3;mp3.Stop();SetDlgItemText(IDC_pause,"暂停");KillTimer(0);//取消计数器的显示CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(280,128,mtime);GetDlgItem(IDC_open)->EnableWindow(FALSE);GetDlgItem(IDC_pause)->EnableWindow(FALSE);GetDlgItem(IDC_stop)->EnableWindow(FALSE);GetDlgItem(IDC_del)->EnableWindow(FALSE);}void CMp3Dlg::Ondel(){UpdateData(TRUE);Mp3 mp3;int index=m_list.GetCurSel();mp3.Stop();SetDlgItemText(IDC_filename,"");KillTimer(0);hour=0;minute=0;second=0;//歌曲时间置0if (index!=CB_ERR){m_list.DeleteString(index);}}void CMp3Dlg::Onexit(){// TODO: Add your control notification handler code hereCDialog::OnCancel();}ctrl+w打开类向导,如图,添加ontimer函数代码如下:void CMp3Dlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCString mtime;Mp3 mp3;second++;CClientDC dc(this);dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色if(second==60)//设置钟表的显示{minute++;second=0;}if(minute==60){hour++;minute=0;}mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(280,128,mtime);DWORD cdf=mp3.getinformation(MCI_STATUS_POSITION);DWORD cdfrom;cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRAM E(cdf));//获取当前播放文件的信息UpdateData(false);CDialog::OnTimer(nIDEvent);}ctrl+w打开类向导添加函数如下void CMp3Dlg::OnDblclkList() //在列表中选中,双击左键播放音乐{CString mtime;Mp3 mp3;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(280,128,mtime);CString strfilename;int index=m_list.GetCurSel();m_list.GetText(index,strfilename);SetDlgItemText(IDC_filename,strfilename);mp3.Stop();mp3.Load(this->m_hWnd,strfilename);mp3.Play();SetTimer(0,1000,NULL);}打开类向导,添加函数如下void CMp3Dlg::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult) {// TODO: Add your control notification handler code hereUpdateData(true);m_int=m_slider.GetPos()/10;Setvolumn(m_slider.GetPos());UpdateData(false);*pResult = 0;}打开类向导,添加函数如下void CMp3Dlg::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereSetvolumn(m_slider.GetPos());*pResult = 0;}添加声音设置函数如下DWORD CMp3Dlg::Setvolumn(DWORD vol){MCI_DGV_SETAUDIO_PARMS mcisetvolumn;mcisetvolumn.dwCallback=NULL;mcisetvolumn.dwItem=MCI_DGV_SETAUDIO_VOLUME;mcisetvolumn.dwValue=vol;MCI_OPEN_PARMS mciopenparms;DWORD DeviceID;DeviceID=mciopenparms.wDeviceID;mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAU DIO_ITEM,(DWORD)(LPVOID)&mcisetvolumn);// return mcisetvolumn.dwValue;return 0;}到此已经基本完成了,我们可以试听一下接下来我们可以到包成exe可执行文件,为了去掉那个不好看的图标,我们可以进入res文件夹,把原来的图标删掉,不过,你要放入一个cio格式的图片作为图标,cio格式网上有很多转换的,删掉原图标后,程序会自动生成一个你放进去的图标。