




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/ Midi.h/* 这篇文章是我第一次在VC在线发表,我应该是只VC的菜鸟。为了找个能循环播放mp3的VC源程序,我搜遍了网上的资源(差点气得要砸电脑),好不容易找到一个,却只有程序中的调用,关键的类的生成文件却没有,有什么用?(主要是自己没有MCI函数的具体的参数资料,不知道怎么调用,如果你有,请发一份给我,字符串的我已经有了,命令方式的没有。) 后来找到一个,非常感谢他,作者叫:黄利龙。但他没有单独把类分离出来,且没有保存列表到文件。 我把他的程序打印出来,仔细分析了程序语句,然后进行了修改和优化。大家可以从下面的程序看出来,我们菜鸟的人基础不够,很希望了解每一句的确切意思,有些地方我带有猜测的,如果有错的地方,请大家指出,也欢迎大家来信和我交流,我向您学习。我的Email: 我修改的程序特点如下: 1、把它分离出来单独构成一个类,便于以后所有程序的使用。 2、提供了接口函数。 3、支持所有的媒体类型 4、能循环播放音乐 5、能保存上次打开的文件。 难免会有错,请大家可以不断完善它,然后把它贴出来,这样,以后有类似遭遇的不用这么辛苦了! CMidi类的使用方法: 1、直接把MIDI.h和MIDI.cpp文件复制到你程序目录下,工程中加入这两个文件。 2、单击“工程-设置-Link”,在“对象/库模块”中连接库winmm.lib 3、在你工程的头文件中包含头文件,#include MIDI.H 4、在工程中定义一个CMidi类的对象,如:CMidi m_Music; 5、在工程的初始化文件中,初始化歌曲列表路径,m_Music.InitPath(), 再打开列表,m_Misic.OpenList();下面就可以在各个对应的消息函数中处理它了 如: 播放:m_Misic.Play(); 停止:m_Misic.Stop(); 上一首:m_Misic.Per(); 下一首:m_Misic.Next(); 打开:m_Misic.OpenFiles(); 保存歌曲列表:m_Misic.SaveList(); /保存列表我没有放在打开函数中,如果打开的文件比较多,那样会在打开过一会儿才能播放音乐,不舒服,你自己到工程的OnDestroy()中保存吧 循环播放:m_Misic.OnTimer(); /它需要在主程序中打开一个定时器,SetTimer(0,500,NULL);然后在主程序中重载OnTimer()函数,在该函数体内,先判断是否正在播放, m_Misic.PlayingFalg是否为真,真,则调用循环播放函数。如下: if(m_Misic.PlayingFalg) m_Misic.OnTimer(); */#ifndef _MIDI_H_#define _MIDI_H_#include class CMidipublic:bool Play();/播放初始化函数(打开设备并初始化)CMidi();CMidi();public:void OnTimer();/循环播放函数bool InitPath();/初始化路径,取得播放曲目列表文件的全路径bool OpenFiles();/打开文件对话框,获取歌曲列表bool OpenList();/读取文件中的歌曲列表bool SaveList();/保存列表void Per();/上一首void Next();/下一首void Stop();/停止函数,在播放以前先停止DWORD getinfo(DWORD item);/获取歌曲长度信息DWORD m_count;DWORD cdlen,cdfrom,cdto;int m_totalFiles;/保存歌曲的首数int fr;/当前已播放的歌曲数CString m_FileList256;/歌曲路径列表数组CString m_MusicFilePath;/保存歌曲列表文件的路径bool PlayingFalg;/正在播放标志,以便定时器判断;#endif/以下为MIDI.cpp文件/ Midi.cpp#include stdafx.h#include Midi.hCMidi:CMidi()m_totalFiles=0;fr=0;cdfrom=0;m_MusicFilePath=;PlayingFalg=false;CMidi:CMidi()/-播放-bool CMidi:Play()if(m_FileListfr=)/如果读取路径为空,则弹出打开对话框OpenFiles();else PlayingFalg=true;/标志为正在播放MCI_OPEN_PARMS mciopenparms;/打开MCI_PLAY_PARMS mciplayparms;/播放/以下用fr做下标,能在停止再播放时恢复上次的位置mciopenparms.lpstrElementName=m_FileListfr;/播放路径mciopenparms.lpstrDeviceType=NULL;/文件类型为NULL,就可以支持全部类型mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,(DWORD)(LPVOID)&mciopenparms);/向MCI设备发送命令消息m_count=mciopenparms.wDeviceID;mciplayparms.dwCallback=NULL;/窗口拥有者句柄cdlen=getinfo(MCI_STATUS_LENGTH);/得到曲目长度 cdto=MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen),MCI_HMS_MINUTE(cdlen),MCI_HMS_SECOND(cdlen);/根据长度计算出时、分、秒mciplayparms.dwFrom=MCI_MAKE_HMS(0,0,0);/表示从哪儿开始播放吧mciplayparms.dwTo=cdto;/表示放到哪儿为止mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,(DWORD)(LPVOID)& mciplayparms);/发送播放消息return true;/-获取歌曲信息(长度,已播放长度)-DWORD CMidi:getinfo(DWORD item)MCI_STATUS_PARMS mcistatusparms;mcistatusparms.dwCallback=NULL;/*/接受传入的命令参数,这是关键。命令参数如下: 获取歌曲长度: MCI_STATUS_LENGTH 获取当前已播放的长度:MCI_STATUS_POSITION*/mcistatusparms.dwItem=item;/接受命令参数的地方mcistatusparms.dwReturn=0;/返回值mciSendCommand(m_count,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);return mcistatusparms.dwReturn;/-停止-void CMidi:Stop()PlayingFalg=false;/关闭正在播放标志cdfrom=MCI_MAKE_HMS(0,0,0);/播放位置归文件开头mciSendCommand(m_count,MCI_CLOSE,0,NULL);/发出关闭消息m_count=0;/-下一首-void CMidi:Next()fr+;if(fr=m_totalFiles)/让fr指向下一个音乐文件,fr是从0下标开始/m_totalFiles为总文件数fr=fr%m_totalFiles;Stop();Play();/-上一首-void CMidi:Per()fr-;if(fr=-1)/指向最后一首歌,但fr是从0下标开始的,而m_totalFiles是从1开始fr=m_totalFiles-1;Stop();Play();/播放fr指向的位置/-保存曲目列表-bool CMidi:SaveList()CFile fileList;/文件对象if(!fileList.Open(m_MusicFilePath,CFile:modeCreate|CFile:modeWrite)return FALSE;/打开文件,不存在则创建,写文件char fileName256;for(int i=0;iM_TOTALFILES;I+)/m_totalFiles为打开对话框中获取的歌曲总数strcpy(fileName,m_FileListi);/取出一条曲目路径fileList.Write(fileName,strlen(fileName);/写入文件fileList.Write(rn,2);/写入一行结束和换行符fileList.Write(-,4);/写入文件最后标志fileList.Close();/关闭文件return TRUE;/-读取曲目路径列表-bool CMidi:OpenList()CFile fileList;if(!fileList.Open(m_MusicFilePath,CFile:modeNoTruncate|CFile:modeRead)return FALSE;/以只读模式打开,不覆盖原有文件,m_MusicFilePath为列表文件的路径char ch;while(1)CString fileName;fileList.Read(&ch,1);/读入一个字符if(ch=-) break; /如文件是最后返回,-是文件最后的标志fileName+=ch;/否则存入while(1)/读入一行fileList.Read(&ch,1);if(ch=r)/这儿可以判断是一行了m_totalFiles+;/曲目首数计数fileList.Read(&ch,1);break;fileName+=ch; /下面这句把路径加入列表中,用字符串数组代替/m_totalFiles前面已经加一了,所以这儿要少一个m_FileListm_totalFiles-1=fileName;fileList.Close();return TRUE;/-打开对话框,获取曲目列表-bool CMidi:OpenFiles()CFileDialog f(true);/打开对话框对象f.m_ofn.Flags |=512;/OFN_ALLOWMULTISELECT;目录列表方式f.m_ofn.lpstrFilter=所有媒体类型0*.*00; if(f.DoModal()!=IDOK)return FALSE;/用户单击了“取消”POSITION pos=f.GetStartPosition();/获取第一个文件位置int i=0;while(pos)m_FileListi=f.GetNextPathName(pos);/读取文件到曲目路径列表i+;m_totalFiles=i;/保存曲目总数Stop();Play();/播放打开的文件return TRUE;/-获得播放列表文件的路径-bool CMidi:InitPath()/初始化路径,取得播放曲目列表文件的全路径TCHAR path256;/保存文件路径GetModuleFileName(NULL,path,sizeof(p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 动手做做看教学课件
- 地理非洲教学课件
- 护理暖心培训
- 专业裁判教学课件模板
- 小学教学微课课件模板
- 工务段线路知识培训总结课件
- 工务专业抢险知识培训课件
- 摊位租赁合同
- 皮带车间安全知识培训课件
- 写好作文开头教学课件
- 2024-2025学年吉林省吉林十二中高一(下)期末数学试卷(含答案)
- 2025年全国招标采购专业技能大赛(央企组)复习题及答案-竞赛类
- 疾病诊断讲课
- 手术室术中无菌技术课件
- 企业安全生产费用支出负面清单
- 2025年食品安全培训考试试题(含答案)
- 2025新《治安管理处罚法》解读
- 气候变化对水资源供需关系的动态演变分析
- 老年人吸入性肺炎护理
- 春季儿童增高课件
- 2025年山东省中考数学试卷(含答案逐题解析)
评论
0/150
提交评论