MFC音乐播放器傻瓜教程_第1页
MFC音乐播放器傻瓜教程_第2页
MFC音乐播放器傻瓜教程_第3页
MFC音乐播放器傻瓜教程_第4页
MFC音乐播放器傻瓜教程_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 代码下载地址1、建立工程21、建立一个MFC工程,命名为Tao_Music32、选择为基本对话框33、包含Windows Sockts44、使用静态链接库方便一会直接生成的exe文件单独可以发布52、 搭建界面51、 拖入控件:52、 控件拖入并摆好63、 控件属性设置:73、 写代码实现功能151、变量绑定:152、加入图片资源163、新建mp3类:174、修改Tao_MusicDlg.h205、修改Tao_Music.cpp216、功能实现:327、加一个TImer消息使时间跑起来!398、给音量控制滑块加消息,使音量控制实现42编译运行完工!431、建立工程1、建立一个MFC工程,命名

2、为Tao_Music2、选择为基本对话框3、包含Windows Sockts因为要用网络功能4、使用静态链接库方便一会直接生成的exe文件单独可以发布2、 搭建界面1、 拖入控件:拖入7个用于播放控制的button,一个picture控件,一个控制音量的滑块。一个Group Box用于盛放搜索功能各个控件及Group Box中2个静态文本,2个可编辑文本,一个搜索按钮。最下面的是一个List Control用于显示歌曲的。最终效果如下:2、 控件拖入并摆好3、 控件属性设置:选中Button1右键选择属性,弹出:将其改为:相同的道理将音乐控制的7个按钮和搜索按钮的Styles和Extended

3、 Styles都设置成相同的风格。Button2-8的General属性依次为:【注意大小写】相应的这里picture控件的属性为:音量滑块的属性为:Group Box的属性为:2个静态文本的属性只要改General就行啦:2个文本编辑框也只要改General就行:最后是list control控件的属性:好啦,最终的效果就是这样的:前面这么啰嗦大家千万别弄错啦!接下来就是写代码啦!3、 写代码实现功能1、变量绑定:查看->建立类向导->Member Variables将其设置为:【双击对应蓝条即出现设置对话框】最后别忘点确定!2、加入图片资源【首先用格式工厂转换出32X32的24

4、张bmp图片,放入工程文件的res文件中->进入Resource界面->右键Tao_Music resources->insert->弹出的对话框点击导入然后将你的24张bmp图片一个一个导入,注意这里最多每次导入8个,要分批导入!导入后的ID为IDB_BITMAP1-IDB_BITMAP24】3、新建mp3类:【插入->新建类】/mp3.h/音乐播放控制类#include "mmsystem.h"/必须同时引入#pragma comment(lib,"Winmm.lib")class mp3 public:mp3();vi

5、rtual mp3(); HWND m_hWnd;/3个变量DWORD DeviceID; MCI_OPEN_PARMS mciopenparms; void Load(HWND hwnd,CString Strfilepath);DWORD getinformation(DWORD item);void Play();void Pause();void resum();void Stop();DWORD Setvolumn(DWORD vol);/mp3.cpp#include "StdAfx.h"#include "mp3.h"#include &q

6、uot;Digitalv.h" /-mp3:mp3()/-mp3:mp3()/-/加载函数/-void mp3:Load(HWND hwnd,CString Strfilepath)/MessageBox(hwnd,Strfilepath,"43",MB_ICONHAND);m_hWnd=hwnd;mciSendCommand(DeviceID,MCI_CLOSE,0,0);/在加载文件前先清空上一次播放的设备mciopenparms.lpstrElementName=Strfilepath;/将音乐文件路径传给设备DWORD dwReturn;if (dwRet

7、urn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPVOID)&mciopenparms)/如果打开文件失败,则将出错信息储存在buffer,并显示出错警告char buffer256; mciGetErrorString(dwReturn,buffer,256);/MessageBox(hwnd,buffer,"HeHe,You Are Wrong!",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);/打开文件成功就关联文件到设备DeviceID=mc

8、iopenparms.wDeviceID;/-DWORD mp3:getinformation(DWORD item)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 mcipla

9、yparms;mciplayparms.dwCallback=(DWORD)m_hWnd;mciplayparms.dwFrom=0;/每次播放都是从0开始播放mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);/-/暂停/-void mp3:Pause()mciSendCommand(DeviceID,MCI_PAUSE,0,0);/-/重播/-void mp3:resum()mciSendCommand(DeviceID,MCI_RESUME,0,0);/-/停止/-v

10、oid mp3:Stop()mciSendCommand(DeviceID,MCI_STOP,0,0);mciSendCommand(DeviceID,MCI_CLOSE,0,0);/当点击停止按钮时,将所有的信息都清除掉/-/设置音量/-DWORD mp3:Setvolumn(DWORD vol)MCI_DGV_SETAUDIO_PARMS mcisetvolumn;mcisetvolumn.dwCallback=(DWORD)m_hWnd;mcisetvolumn.dwItem=MCI_DGV_SETAUDIO_VOLUME;mcisetvolumn.dwValue=vol;mciSend

11、Command(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mcisetvolumn);/return mcisetvolumn.dwValue;return 0;4、修改Tao_MusicDlg.h在CTao_MusicDlg类里加入下面函数和变量public:void Show(int cnt);void addsong(TCHAR * name);void suiji();void pre();void next();void drawpic(int nTim

12、erID);BOOL AnalyseLrc(TCHAR* LrcFile);/歌词解析函数BOOL DownLoad(TCHAR* Url, TCHAR* SaveName);/下载资源函数bool down(TCHAR* song,TCHAR* songer,TCHAR* getstr);/下载XML资源函数public:int hour,minute,second;CString cursong;int showstr;int donghuakind;/动画种类初始化时给一个随机数,选择显示的动画种类CImageListm_imList;typedef struct _LRC_INFO/定

13、义歌词结构体int Time;TCHAR Lyric256;LRC_INFO;LRC_INFO LrcInfo500;5、修改Tao_Music.cppl 在include下面再引入下面几个文件和库:#include "mp3.h"#include "mmsystem.h"#include "digitalv.h"#include <afxinet.h>#include <shlwapi.h>#pragma comment(lib,"Winmm.lib")#pragma comment(li

14、b,"wininet.lib") #pragma comment(lib, "shlwapi.lib")l 紧接着在全局声明一个mp3型的全局变量:mp3 Mp3;l 转到OnInitDialog()函数处在return 前加入如下代码:/ TODO: Add extra initialization hereSetWindowText("MP3播放器");/标题m_slider.SetRange(0,1000); /移动范围m_slider.SetPos(500);/滑块指针的初始位置GetDlgItem(IDC_open)->

15、;EnableWindow(FALSE);GetDlgItem(IDC_pause)->EnableWindow(FALSE); GetDlgItem(IDC_del)->EnableWindow(FALSE);/List 初始化-/ 设置CListCtrl控件扩展风格:整行选中子项目图标列表|LVS_EX_GRIDLINESDWORD dwStyle; dwStyle =m_StoreItems.GetExtendedStyle(); dwStyle = dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES ;m_StoreItems

16、.SetExtendedStyle(dwStyle); / 载入32*32像素 24位真彩(ILC_COLOR24)图片m_imList.Create(32,32,ILC_COLOR24,10,20); / 创建图像序列CImageList对象/ 设置CImageList图像列表与CListCtrl控件关联 LVSIL_SMALL小图标列表m_StoreItems.SetImageList(&m_imList,LVSIL_SMALL);/ 向列表视图控件InsertColumn插入3列数据 CRect mRect;m_StoreItems.GetWindowRect(&mRec

17、t); / 获取控件矩形区域int length = mRect.Width()-3;m_StoreItems.InsertColumn(0, _T("图片"), LVCFMT_CENTER,40, -1);m_StoreItems.InsertColumn(1, _T("信息"), LVCFMT_LEFT, length-60, -1);/-cursong=""showstr=0;donghuakind=rand()%4;/ TODO: Add extra initialization herel 在文件最后依次添加如下函数:/-/

18、显示函数/显示cnt=0为open/1为delete/2为stop/3为timer/-void CTao_MusicDlg:Show(int cnt)CClientDC dc(this);CString mtime;TCHAR temp19;DWORD cdf,cdfrom;int showstrlen=18,i;int tposx,tposy,sposx,sposy;tposx=12,tposy=128;sposx=12,sposy=81;switch(cnt)case 0:hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0);/设置放置

19、计数器区域的外观dc.SetTextColor(RGB(255,255,203);/设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);/显示时间进度dc.TextOut(tposx,tposy,mtime);for(i=0;i<showstrlen;i+)tempi=cursong(i+showstr)%cursong.GetLength();tempi='0'showstr=(showstr+1)%cursong.GetLength();mtime.Format("- &q

20、uot;);/覆盖上次显示dc.TextOut(sposx,sposy,mtime);dc.TextOut(sposx,sposy,temp);break;case 1:dc.TextOut(sposx,sposy,"");KillTimer(0);KillTimer(1);KillTimer(2);hour=0;minute=0;second=0;/歌曲时间置0break;case 2:KillTimer(0);/取消计数器的显示KillTimer(1);KillTimer(2);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124

21、,252,0);/设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203);/设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);/显示时间进度dc.TextOut(tposx,tposy,mtime);for(i=0;i<showstrlen;i+)tempi=cursong(i+showstr)%cursong.GetLength();tempi='0'showstr=(showstr+1)%cursong.GetLength();mtime.Form

22、at("- ");/覆盖上次显示dc.TextOut(sposx,sposy,mtime);dc.TextOut(sposx,sposy,temp);break;case 3:second+;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",ho

23、ur,minute,second);/显示时间进度/dc.TextOut(280,128,mtime); cdf=Mp3.getinformation(MCI_STATUS_LENGTH);/获得当前毫秒值MCI_STATUS_POSITIONif(cdf<=Mp3.getinformation(MCI_STATUS_POSITION)/如果停止就进行换歌CString strtemp;GetDlgItemText(IDC_exit,strtemp);/获取按钮状态if (strtemp.Compare("单曲")=0)Mp3.Setvolumn(1000-m_sli

24、der.GetPos();/声音设为滑块指示的地方Mp3.Load(this->m_hWnd,cursong);Mp3.Play();hour=0;minute=0;second=0;else if(strtemp.Compare("顺序")=0)next();else if(strtemp.Compare("随机")=0)suiji(); cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRAME(cdf);/获取当前播放文件的信息mtime.Format(&

25、quot;%02d:%02d:%02d / %02d:%02d",hour,minute,second,cdf/1000/60,cdf/1000%60);dc.TextOut(tposx,tposy,mtime);for(i=0;i<showstrlen;i+)tempi=cursong(i+showstr)%cursong.GetLength();tempi='0'showstr=(showstr+1)%cursong.GetLength();mtime.Format("- ");/覆盖上次显示dc.TextOut(sposx,sposy,

26、mtime);dc.TextOut(sposx,sposy,temp);break;default:break;/-/添加歌词/-void CTao_MusicDlg:addsong(TCHAR * name)/wsprintf(strNumber,_T("IDB_BITMAP%d"),rand()%24+162);CBitmap * pBmp = NULL;pBmp = new CBitmap();pBmp->LoadBitmap(rand()%24+IDB_BITMAP1);/ 载入位图m_imList.Add(pBmp,RGB(0,0,0); delete pB

27、mp; / 添加数据 InsertItem向列表中插入主项数据 SetItemText向列表中的子项写入数据LVITEM lvItem=0;/ 列表视图控 LVITEM用于定义"项"的结构lvItem.mask = LVIF_IMAGE|LVIF_TEXT;/ 文字、图片lvItem.iItem = m_StoreItems.GetItemCount();/ 行号lvItem.iImage = m_StoreItems.GetItemCount();/ 图片索引号(第一幅图片 IDB_BITMAP1)lvItem.iSubItem = 0;/ 子列号m_StoreItems

28、.InsertItem(&lvItem); / 第一列为图片m_StoreItems.SetItemText(m_StoreItems.GetItemCount()-1,1,name); / 第二列为名字/-/随机函数/-void CTao_MusicDlg:suiji()int index=m_StoreItems.GetSelectionMark();/获取选中的文本if(index=-1)MessageBox("请添加音乐");return;index=rand()%m_StoreItems.GetItemCount();CString strfilename

29、;char str300;m_StoreItems.GetItemText(index,1,str,sizeof(str);strfilename.Format(_T("%s"),str);cursong=strfilename;m_StoreItems.EnsureVisible(index,FALSE);/选中m_StoreItems.SetItemState(index,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); /选中行m_StoreItems.SetSelectionMark(index);m_S

30、toreItems.SetFocus();/SetDlgItemText(IDC_filename,strfilename);Mp3.Stop();Mp3.Load(this->m_hWnd,strfilename);Mp3.Play();Mp3.Setvolumn(1000-m_slider.GetPos();/声音设为滑块指示的地方 SetTimer(0,1000,NULL);SetTimer(1,100,NULL);SetTimer(2,100,NULL);GetDlgItem(IDC_open)->EnableWindow(TRUE);GetDlgItem(IDC_paus

31、e)->EnableWindow(TRUE); GetDlgItem(IDC_del)->EnableWindow(TRUE);Show(0);/-/上一曲/-void CTao_MusicDlg:pre()int index=m_StoreItems.GetSelectionMark();/获取选中的文本if(index=-1)MessageBox("请添加音乐");return;index=(index-1+m_StoreItems.GetItemCount()%m_StoreItems.GetItemCount();CString strfilename;

32、char str300;m_StoreItems.GetItemText(index,1,str,sizeof(str);strfilename.Format(_T("%s"),str);cursong=strfilename;m_StoreItems.EnsureVisible(index,FALSE);/选中m_StoreItems.SetItemState(index,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); /选中行m_StoreItems.SetSelectionMark(index);m_St

33、oreItems.SetFocus();/SetDlgItemText(IDC_filename,strfilename);Mp3.Stop();Mp3.Load(this->m_hWnd,strfilename);Mp3.Play();Mp3.Setvolumn(1000-m_slider.GetPos();/声音设为滑块指示的地方 SetTimer(0,1000,NULL);SetTimer(1,100,NULL);SetTimer(2,100,NULL);GetDlgItem(IDC_open)->EnableWindow(TRUE);GetDlgItem(IDC_pause

34、)->EnableWindow(TRUE); GetDlgItem(IDC_del)->EnableWindow(TRUE);Show(0);/-/下一曲/-void CTao_MusicDlg:next()int index=m_StoreItems.GetSelectionMark();/获取选中的文本if(index=-1)MessageBox("请添加音乐");return;index=(index+1)%m_StoreItems.GetItemCount();CString strfilename;char str300;m_StoreItems.Ge

35、tItemText(index,1,str,sizeof(str);strfilename.Format(_T("%s"),str);cursong=strfilename;m_StoreItems.EnsureVisible(index,FALSE);/选中m_StoreItems.SetItemState(index,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); /选中行m_StoreItems.SetSelectionMark(index);m_StoreItems.SetFocus();/SetDlg

36、ItemText(IDC_filename,strfilename);Mp3.Stop();Mp3.Load(this->m_hWnd,strfilename);Mp3.Play();Mp3.Setvolumn(1000-m_slider.GetPos();/声音设为滑块指示的地方 SetTimer(0,1000,NULL);SetTimer(1,100,NULL);SetTimer(2,100,NULL);GetDlgItem(IDC_open)->EnableWindow(TRUE);GetDlgItem(IDC_pause)->EnableWindow(TRUE); G

37、etDlgItem(IDC_del)->EnableWindow(TRUE);Show(0);/-/解析歌词/-BOOL CTao_MusicDlg:AnalyseLrc(TCHAR* LrcFile) /读取文件到缓冲区中TCHAR* LrcBuf = NULL;FILE* fp = fopen(LrcFile, "rb");if( fp = NULL)return FALSE;fseek(fp, 0L, SEEK_END);long LrcLen = ftell(fp);if(LrcLen = 0)return FALSE;LrcBuf = (TCHAR*) ma

38、lloc(sizeof(TCHAR) * LrcLen + 1); /开辟缓冲区if(LrcBuf = NULL)return FALSE;fseek(fp, 0L, SEEK_SET);fread(LrcBuf, LrcLen + 1, 1, fp);if(LrcBuf = NULL)return FALSE;fclose(fp); /分析缓冲区中内容TCHAR *p1 = NULL;TCHAR *p2 = NULL;int m, n;int i, j = 0;TCHAR* Lrc = LrcBuf;TCHAR CurTime100;TCHAR Lyric1024;int nCurTime;

39、while(1)/解析时间p1 = strchr(Lrc, ''); m = p1-Lrc;p2 = strchr(Lrc, '');n = p2-Lrc;for(i = m + 1; i < n; i+)CurTimei - m - 1 = Lrci;CurTimei - m - 1 = '0'/解析歌词Lrc = p2;p1 = strchr(Lrc, '');m = p1-Lrc;p2 = strchr(Lrc, '');n = p2-Lrc; for( i = m + 1; i < n; i+)

40、Lyrici - m - 1 = Lrci;Lyrici - m - 1 = '0'if(p2 = NULL)break;Lrc = p2;if(lstrlen(Lyric) = 1 | lstrlen(Lyric) = 2)continue;/计算时间TCHAR* ptime = strchr(CurTime, ':');int k = ptime-CurTime;TCHAR temp100;for(i = k + 1; i < lstrlen(CurTime); i+)tempi - k - 1 = CurTimei;tempi - k - 1 = &

41、#39;0'nCurTime = (CurTime0 - '0') * 10 + (CurTime1 - '0') * 60 + atoi(temp) ) * 1000;LrcInfoj.Time = nCurTime;lstrcpy(LrcInfoj.Lyric, Lyric);j+;free(LrcBuf);LrcBuf = NULL;return TRUE;/-/下载资源函数/-BOOL CTao_MusicDlg:DownLoad(TCHAR* Url, TCHAR* SaveName)DWORD byteread = 0;TCHAR buffe

42、r100000;memset(buffer, 0,100000);HINTERNET internetopen;internetopen =InternetOpen("Testing", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (internetopen = NULL)return FALSE;HINTERNET internetopenurl;internetopenurl = InternetOpenUrl(internetopen, Url, NULL, 0, INTERNET_FLAG_RELOAD, 0);i

43、f (internetopenurl = NULL)InternetCloseHandle(internetopen);return FALSE;BOOL hwrite;DWORD written;HANDLE createfile;createfile = CreateFile(SaveName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);if (createfile = INVALID_HANDLE_VALUE)InternetCloseHandle(internetopenurl);return FALSE

44、;BOOL internetreadfile;while(1)internetreadfile = InternetReadFile(internetopenurl, buffer, sizeof(buffer), &byteread);if(byteread=0)break;hwrite = WriteFile(createfile, buffer, sizeof(buffer), &written, NULL);if (hwrite = 0)CloseHandle(createfile);return FALSE;CloseHandle(createfile);return

45、 TRUE;/-/下载XML保存在getstr里/-bool CTao_MusicDlg:down(TCHAR* song,TCHAR* songer,TCHAR* getstr)/TCHAR* Url=new TCHARstrlen(song)+strlen(songer)+100;sprintf(Url,"DWORD byteread = 0;TCHAR buffer100000;memset(buffer, 0,100000);HINTERNET internetopen;internetopen =InternetOpen("Testing", INTER

46、NET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (internetopen = NULL)delete Url;return FALSE;HINTERNET internetopenurl;internetopenurl = InternetOpenUrl(internetopen, Url, NULL, 0, INTERNET_FLAG_RELOAD, 0);if (internetopenurl = NULL)InternetCloseHandle(internetopen);delete Url;return FALSE;while(1)InternetReadFile(internetopenurl, buffer, sizeof(buffer), &byteread);if(byteread=0)break;sprintf(getstr,"%s",buffer);delete Url;return TR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论