MFC音乐播放器傻瓜教程.docx
《MFC音乐播放器傻瓜教程.docx》由会员分享,可在线阅读,更多相关《MFC音乐播放器傻瓜教程.docx(48页珍藏版)》请在冰豆网上搜索。
![MFC音乐播放器傻瓜教程.docx](https://file1.bdocx.com/fileroot1/2022-11/25/2e996db3-3c0a-4d0a-ad1f-06eb3c66e022/2e996db3-3c0a-4d0a-ad1f-06eb3c66e0221.gif)
MFC音乐播放器傻瓜教程
代码下载地址
1、建立工程
1、建立一个MFC工程,命名为Tao_Music
2、选择为基本对话框
3、包含WindowsSockts
[因为要用网络功能]
4、使用静态链接库[方便一会直接生成的exe文件单独可以发布]
2、搭建界面
1、拖入控件:
拖入7个用于播放控制的button,一个picture控件,一个控制音量的滑块。
一个GroupBox用于盛放搜索功能各个控件及GroupBox中2个静态文本,2个可编辑文本,一个搜索按钮。
最下面的是一个ListControl用于显示歌曲的。
最终效果如下:
2、控件拖入并摆好
3、控件属性设置:
选中Button1右键选择属性,弹出:
将其改为:
相同的道理将音乐控制的7个按钮和搜索按钮的Styles和ExtendedStyles都设置成相同的风格。
Button2-8的General属性依次为:
【注意大小写】
相应的这里picture控件的属性为:
音量滑块的属性为:
GroupBox的属性为:
2个静态文本的属性只要改General就行啦:
2个文本编辑框也只要改General就行:
最后是listcontrol控件的属性:
好啦,最终的效果就是这样的:
前面这么啰嗦大家千万别弄错啦!
接下来就是写代码啦!
3、写代码实现功能
1、变量绑定:
查看->建立类向导->MemberVariables
将其设置为:
【双击对应蓝条即出现设置对话框】最后别忘点确定!
2、加入图片资源
【首先用格式工厂转换出32X32的24张bmp图片,放入工程文件的res文件中->进入Resource界面->右键Tao_Musicresources->insert->弹出的对话框点击导入然后将你的24张bmp图片一个一个导入,注意这里最多每次导入8个,要分批导入!
导入后的ID为IDB_BITMAP1----IDB_BITMAP24】
3、新建mp3类:
【插入->新建类】
//mp3.h
//音乐播放控制类
#include"mmsystem.h"//必须同时引入
#pragmacomment(lib,"Winmm.lib")
classmp3
{
public:
mp3();
virtual~mp3();
HWNDm_hWnd;//3个变量
DWORDDeviceID;
MCI_OPEN_PARMSmciopenparms;
voidLoad(HWNDhwnd,CStringStrfilepath);
DWORDgetinformation(DWORDitem);
voidPlay();
voidPause();
voidresum();
voidStop();
DWORDSetvolumn(DWORDvol);
};
//mp3.cpp
#include"StdAfx.h"
#include"mp3.h"
#include"Digitalv.h"
//---------------------------------------------------------------------
mp3:
:
mp3()
{
}
//---------------------------------------------------------------------
mp3:
:
~mp3()
{
}
//---------------------------------------------------------------------
//加载函数
//---------------------------------------------------------------------
voidmp3:
:
Load(HWNDhwnd,CStringStrfilepath)
{
//MessageBox(hwnd,Strfilepath,"43",MB_ICONHAND);
m_hWnd=hwnd;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备
mciopenparms.lpstrElementName=Strfilepath;//将音乐文件路径传给设备
DWORDdwReturn;
if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPVOID)&mciopenparms))
{
//如果打开文件失败,则将出错信息储存在buffer,并显示出错警告
charbuffer[256];
mciGetErrorString(dwReturn,buffer,256);
//MessageBox(hwnd,buffer,"HeHe,YouAreWrong!
",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);
}
//打开文件成功就关联文件到设备
DeviceID=mciopenparms.wDeviceID;
}
//---------------------------------------------------------------------
DWORDmp3:
:
getinformation(DWORDitem)
{
MCI_STATUS_PARMSmcistatusparms;
mcistatusparms.dwItem=item;
mcistatusparms.dwReturn=0;
mciSendCommand(DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);
returnmcistatusparms.dwReturn;
}
//---------------------------------------------------------------------
//播放函数
//---------------------------------------------------------------------
voidmp3:
:
Play()
{
MCI_PLAY_PARMSmciplayparms;
mciplayparms.dwCallback=(DWORD)m_hWnd;
mciplayparms.dwFrom=0;//每次播放都是从0开始播放
mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);
}
//---------------------------------------------------------------------
//暂停
//---------------------------------------------------------------------
voidmp3:
:
Pause()
{
mciSendCommand(DeviceID,MCI_PAUSE,0,0);
}
//---------------------------------------------------------------------
//重播
//---------------------------------------------------------------------
voidmp3:
:
resum()
{
mciSendCommand(DeviceID,MCI_RESUME,0,0);
}
//---------------------------------------------------------------------
//停止
//---------------------------------------------------------------------
voidmp3:
:
Stop()
{
mciSendCommand(DeviceID,MCI_STOP,0,0);
mciSendCommand(DeviceID,MCI_CLOSE,0,0);
//当点击停止按钮时,将所有的信息都清除掉
}
//---------------------------------------------------------------------
//设置音量
//---------------------------------------------------------------------
DWORDmp3:
:
Setvolumn(DWORDvol)
{
MCI_DGV_SETAUDIO_PARMSmcisetvolumn;
mcisetvolumn.dwCallback=(DWORD)m_hWnd;
mcisetvolumn.dwItem=MCI_DGV_SETAUDIO_VOLUME;
mcisetvolumn.dwValue=vol;
mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mcisetvolumn);
//returnmcisetvolumn.dwValue;
return0;
}
4、修改Tao_MusicDlg.h
在CTao_MusicDlg类里加入下面函数和变量
public:
voidShow(intcnt);
voidaddsong(TCHAR*name);
voidsuiji();
voidpre();
voidnext();
voiddrawpic(intnTimerID);
BOOLAnalyseLrc(TCHAR*LrcFile);//歌词解析函数
BOOLDownLoad(TCHAR*Url,TCHAR*SaveName);//下载资源函数
booldown(TCHAR*song,TCHAR*songer,TCHAR*getstr);//下载XML资源函数
public:
inthour,minute,second;
CStringcursong;
intshowstr;
intdonghuakind;//动画种类[初始化时给一个随机数,选择显示的动画种类]
CImageListm_imList;
typedefstruct_LRC_INFO//定义歌词结构体
{
intTime;
TCHARLyric[256];
}LRC_INFO;
LRC_INFOLrcInfo[500];
5、修改Tao_Music.cpp
●在include下面再引入下面几个文件和库:
#include"mp3.h"
#include"mmsystem.h"
#include"digitalv.h"
#include
#include
#pragmacomment(lib,"Winmm.lib")
#pragmacomment(lib,"wininet.lib")
#pragmacomment(lib,"shlwapi.lib")
●紧接着在全局声明一个mp3型的全局变量:
mp3Mp3;
●转到OnInitDialog()函数处
在return前加入如下代码:
//TODO:
Addextrainitializationhere
SetWindowText("MP3播放器");//标题
m_slider.SetRange(0,1000);//移动范围
m_slider.SetPos(500);//滑块指针的初始位置
GetDlgItem(IDC_open)->EnableWindow(FALSE);
GetDlgItem(IDC_pause)->EnableWindow(FALSE);
GetDlgItem(IDC_del)->EnableWindow(FALSE);
//List初始化---------------------
//设置CListCtrl控件扩展风格:
整行选中\子项目图标列表|LVS_EX_GRIDLINES
DWORDdwStyle;
dwStyle=m_StoreItems.GetExtendedStyle();
dwStyle=dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES;
m_StoreItems.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列数据
CRectmRect;
m_StoreItems.GetWindowRect(&mRect);//获取控件矩形区域
intlength=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:
Addextrainitializationhere
●在文件最后依次添加如下函数:
//------------------------------------------------------------------------------------------------
//显示函数
//显示cnt=0为open
//1为delete
//2为stop
//3为timer
//------------------------------------------------------------------------------------------------
voidCTao_MusicDlg:
:
Show(intcnt)
{
CClientDCdc(this);
CStringmtime;
TCHARtemp[19];
DWORDcdf,cdfrom;
intshowstrlen=18,i;
inttposx,tposy,sposx,sposy;
tposx=12,tposy=128;
sposx=12,sposy=81;
switch(cnt){
case0:
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(tposx,tposy,mtime);
for(i=0;itemp[i]=cursong[(i+showstr)%cursong.GetLength()];
}temp[i]='\0';
showstr=(showstr+1)%cursong.GetLength();
mtime.Format("----------------------------");//覆盖上次显示
dc.TextOut(sposx,sposy,mtime);
dc.TextOut(sposx,sposy,temp);
break;
case1:
dc.TextOut(sposx,sposy,"");
KillTimer(0);
KillTimer
(1);
KillTimer
(2);
hour=0;minute=0;second=0;//歌曲时间置0
break;
case2:
KillTimer(0);//取消计数器的显示
KillTimer
(1);
KillTimer
(2);
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(tposx,tposy,mtime);
for(i=0;itemp[i]=cursong[(i+showstr)%cursong.GetLength()];
}temp[i]='\0';
showstr=(showstr+1)%cursong.GetLength();
mtime.Format("----------------------------");//覆盖上次显示
dc.TextOut(sposx,sposy,mtime);
dc.TextOut(sposx,sposy,temp);
break;
case3:
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",hour,minute,second);//显示时间进度
//dc.TextOut(280,128,mtime);
cdf=Mp3.getinformation(MCI_STATUS_LENGTH);//获得当前毫秒值MCI_STATUS_POSITION
if(cdf<=Mp3.getinformation(MCI_STATUS_POSITION)){//如果停止就进行换歌
CStringstrtemp;
GetDlgItemText(IDC_exit,strtemp);//获取按钮状态
if(strtemp.Compare("单曲")==0){
Mp3.Setvolumn(1000-m_slider.GetPos());//声音设为滑块指示的地方
Mp3.Load(this->m_hWnd,cursong);
Mp3.Play();
hour=0;minute=0;second=0;
}elseif(strtemp.Compare("顺序")==0){
next();
}elseif(strtemp.Compare("随机")==0){
suiji();
}
}
cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRAME(cdf));//获取当前播放文件的信息
mtime.Format("%02d:
%02d:
%02d/%02d:
%02d",hour,minute,second,cdf/1000/60,cdf/1000%60);
dc.TextOut(tposx,tposy,mtime);
for(i=0;itemp[i]=cursong[(i+showstr)%cursong.GetLength()];
}temp[i]='\0';
showstr=(showstr+1)%cursong.GetLength();
mtime.Format("----------------------------");//覆盖上次显示
dc.TextOut(sposx,sposy,mtime);
dc.TextOut(sposx,sposy,temp);
break;
default:
break;
}
}
//------------------------------------------------------------------------------------------------
//添加歌词
//------------------------------------------------------------------------------------------------
voidCTao_MusicDlg:
:
addsong(TCHAR*name)
{
//wsprintf(strNumber,_T("IDB_BITMAP%d"),rand()%24+162);
CBitmap*pBmp=NULL;
pBmp=newCBitmap();
pBmp->LoadBitmap(rand()%24+IDB_BITMAP1);//载入位图
m_imList.Add(pBmp,RGB(0,0,0));
deletepBmp;
//添加数据InsertItem向列表中插入主项数据SetItemText向列表中的子项写入数据
LVITEMlvItem={0};//列表视图控