vc音频播放器(含源文件)(4)

2019-09-02 17:38

参考文献

[1]姬涛、周启生,《计算机程序设计基础(上册)》[Z],北京:中国传媒大学出版社,2010

[2]谭浩强,《C程序设计教程》[Z],北京:清华大学出版社,2007

[3]任哲,《MFC Windows应用程序设计(第二版)》[Z],北京:清华大学出版社,2007

16

附 录

1.1 Cmidi类中的函数 // Midi.cpp

#include \#include \

CMidi::CMidi() { m_totalFiles=0; fr=0; cdfrom=0;

m_MusicFilePath=\}

CMidi::~CMidi() { }

//------------播放--------------------- bool CMidi::Play() {

if(PlayingFalg) //正在播放则暂停 Pause() else { if(Ispause) { mciSendCommand(m_count,MCI_RESUME,0,NULL); PlayingFalg=true; Ispause=false;

} else {

PlayingFalg=true;//标志为正在播放 MCI_OPEN_PARMS mciopenparms;//打开 MCI_PLAY_PARMS mciplayparms;//播放

//以下用fr做下标,能在停止再播放时恢复上次的位置 mciopenparms.lpstrElementName=m_FileList[fr];//播放路径

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

17

); 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() { if(fr>=0) { fr++;

if(fr>=m_totalFiles) {

//让fr指向下一个音乐文件,fr是从0下标开始 //m_totalFiles为总文件数 fr=0; } Stop(); Play(); } }

//----------上一首------------------ void CMidi::Per() { if(fr>=0) { fr--; if(fr==-1)

{//指向最后一首歌,但fr是从0下标开始的,而m_totalFiles是从1开始 fr=m_totalFiles-1;

} Stop();

Play();//播放fr指向的位置

} }

//----------保存曲目列表----------------- boolCMidi::SaveList() { CFilefileList;//文件对象

if(!fileList.Open(m_MusicFilePath,CFile::modeCreate|CFile::modeWrite)) return FALSE;//打开文件,不存在则创建,写文件 charfileName[256];

for(int i=0;i

{//m_totalFiles为打开对话框中获取的歌曲总数 strcpy(fileName,m_FileList[i]);//取出一条曲目路径 fileList.Write(fileName,strlen(fileName));//写入文件 fileList.Write(\写入一行结束和换行符

}

fileList.Write(\写入文件最后标志 fileList.Close();//关闭文件 return TRUE;

}

//----------读取曲目路径列表----------------- boolCMidi::OpenList() { CFilefileList;

18

if(!fileList.Open(m_MusicFilePath,CFile::modeNoTruncate|CFile::modeRead))

return FALSE;//以只读模式打开,不覆盖原有文件,m_MusicFilePath为列表文件的路径

charch; while(1) { CStringfileName; 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_FileList[m_totalFiles-1]=fileName;

}

fileList.Close(); return TRUE; }

//----------打开对话框,获取曲目列表----------------- boolCMidi::OpenFiles() {

CFileDialog f(true);//打开对话框对象

f.m_ofn.Flags |=512;//OFN_ALLOWMULTISELECT;目录列表方式 f.m_ofn.lpstrFilter=\所有媒体类型\\0*.*\\0\\0\

return FALSE;//用户单击了“取消”

POSITION pos=f.GetStartPosition();//获取第一个文件位置 int i=0; while(pos) { m_FileList[i]=f.GetNextPathName(pos);//读取文件到曲目路径列表 i++;

}

m_totalFiles=i;//保存曲目总数 Stop(); if(PlayingFalg) Stop();

//Play();//播放打开的文件 return TRUE; }

//-------------------获得播放列表文件的路径------------ boolCMidi::InitPath()

{//初始化路径,取得播放曲目列表文件的全路径 TCHAR path[256];//保存文件路径

GetModuleFileName(NULL,path,sizeof(path)) //获取当前程序路径 TCHAR * p = _tcsrchr(path,_T('\\\\')) ;//查找最后一个'\\\\'字符 if(p)

lstrcpy(p,_T(\替换成要查找的完整路径

19

m_MusicFilePath=path;//保存到路径变量中,以便用它来打开列表文件 return true;

}

//----------------------循环播放------------------ void CMidi::OnTimer() {//循环播放

if(getinfo(MCI_STATUS_POSITION)==cdlen) {//如当前播放的长度等于歌曲的长度,说明已经播放完毕 Next();//指向下一首

} }

//----------------------暂停播放------------------ void CMidi::Pause() { PlayingFalg=false;//关闭正在播放标志

mciSendCommand(m_count,MCI_PAUSE,0,NULL); Ispause=true; }

1.2 最小化的相关操作

/////////////////////////////////////最小化到托盘开始/////////////////// void CMy2009Dlg::ToTray() { NOTIFYICONDATA nid;

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME;

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP

nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nid.szTip,\音频播放器\//信息提示条 Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标 ShowWindow(SW_HIDE); //隐藏主窗口

}

/////////////////////////////////////最小化到托盘结束/////////////////// //wParam接收的是图标的ID,而lParam接收的是鼠标的行为 LRESULT CMy2009Dlg::OnShowTask(WPARAM wParam,LPARAMlParam) { if(wParam!=IDR_MAINFRAME)

return 1;

switch(lParam) {

case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭” { LPPOINT lpoint=new tagPOINT; ::GetCursorPos(lpoint);//得到鼠标位置 CMenu menu;

menu.CreatePopupMenu();//声明一个弹出式菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 //隐藏),将程序结束。

menu.AppendMenu(MF_STRING,IDC_Next_BUTTON,\下一曲\menu.AppendMenu(MF_STRING,IDC_Pre_BUTTON,\上一曲\menu.AppendMenu(MF_STRING,IDC_Stop_BUTTON,\停 止\

20


vc音频播放器(含源文件)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:马凳筋施工方案 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: