MFC做音乐播放器——你懂的.doc_第1页
MFC做音乐播放器——你懂的.doc_第2页
MFC做音乐播放器——你懂的.doc_第3页
MFC做音乐播放器——你懂的.doc_第4页
MFC做音乐播放器——你懂的.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

前言:音乐播放器其实我在大一的时候就用非常生硬的语法写出过一个非常简陋的播放器。这次写的这个是以前那个的加强版。虽然说还是有很多bug,而且我至今不知道那些BUG是什么地方的问题。 先给个截图吧,播放器的界面:其实看着还是有那么回事的。恩,其实除了波形和在线下载的话,功能和酷狗,以及千千静听等播放器的功能是一样的。 音乐播放器的关键是播放音乐,所以第一步是要设计一个类,这个类拥有各种各样的播放音乐的能力。 我设计的类名字叫Player class 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_open);/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_status); 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_status); 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_seek); mciSendCommand(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这个函数,传入不同的参数,就可以达到不同的效果。Player类设计完成后,在Dlg这个类当中去产生一个对象:MP3这样就可以通过调用MP3的各个成员来播放声音了。 -以上的大部分技术在大一的时候就有所了解- 后面的文件操作,都是以前不知道的了首先我是在对话框上画了个列表控件。当然了,所有的歌曲数据都是写在它上面的,最最重要的就是列表的第四栏,文件地址只要有文件地址,前三项都可以计算出来,但是为了优化电脑运算速度,可以事先把这些东西写在文件里面,这样显示的时候就不用算了 注意看:对话框初始化工作 BOOL CMusicDlg:OnInitDialog() CDialog:OnInitDialog(); / Add About. menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here m_list.InsertColumn(0,序列,LVCFMT_LEFT,40);/这里就要记住列表控件是如何让头顶上的字按要求划分的 m_list.InsertColumn(1,歌曲名,LVCFMT_LEFT,200); m_list.InsertColumn(2,时长,LVCFMT_LEFT,50); m_list.InsertColumn(3,歌曲路径,LVCFMT_LEFT,172); m_songsum=0; m_vol.SetRangeMax(1000);/滑块控件最大值设定(这里是音量最大设置) m_vol.SetPos(500);/初始化把音量设置为500,注意这里并没有控制音量,而只是把滑块放到中间而已/- m_nid.hWnd=this-m_hWnd;/这下面的都是我以前不知道的,功能是让程序在后台运行。 m_nid.uID=IDR_MAINFRAME;/其实我也看不大懂每一句的意思,只能了解个大概,把他们当做工具吧 m_nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME); m_nid.uCallbackMessage=WM_MUSICHIDE; m_mode=3;/默认的播放模式是全部歌曲循环播放 CFile file(musiclist.txt,CFile:modeRead);/这里是打开文件列表,所以即使播放器关掉了,再次打开,还是有上次加载的歌曲,不用再次 /加载了。 char *ch; CString tempstr=; CString ss; DWORD len; int i,r; len=file.GetLength();/这后面的都是文件操作了,主要是把歌曲的路径以及其他信息读到列表空间上面去 ch=new charlen+1; chlen=0; file.Read(ch,len); file.Close(); for(i=0;iiItem; if(nItem=0&nItemm_list.GetItemCount() int now_play=nItem; m_filepath=m_list.GetItemText(now_pl

温馨提示

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

评论

0/150

提交评论