》目录《
》——————————————————————《
1、建立工程
1、建立一个MFC工程,命名为Tao_Music
2、选择为基本对话框
3、包含Windows Sockts
4、使用静态链接库 [方便一会直接生成的exe文件单独可以发布]
2、 搭建界面
1、 拖入控件:
2、 控件拖入并摆好
3、 控件属性设置:
3、 写代码实现功能
1、变量绑定:
2、加入图片资源
3、新建mp3类:
4、修改Tao_MusicDlg.h
5、修改Tao_Music.cpp
6、功能实现:
7、加一个TImer消息使时间跑起来!
8、给音量控制滑块加消息,使音量控制实现
4、编译运行完工!
》——————————————————————《
1、建立工程
1、建立一个MFC工程,命名为Tao_Music
2、选择为基本对话框
3、包含Windows Sockts
[因为要用网络功能]
4、使用静态链接库 [方便一会直接生成的exe文件单独可以发布]
2、搭建界面
1、拖入控件:
拖入7个用于播放控制的button,一个picture控件,一个控制音量的滑块。一个Group Box用于盛放搜索功能各个控件及Group Box中2个静态文本,2个可编辑文本,一个搜索按钮。最下面的是一个List Control用于显示歌曲的。最终效果如下:
2、控件拖入并摆好
3、控件属性设置:
选中Button1右键选择属性,弹出:
将其改为:
相同的道理将音乐控制的7个按钮和搜索按钮的Styles和Extended Styles都设置成相同的风格。
Button2-8的General属性依次为:【注意大小写】
相应的这里picture控件的属性为:
音量滑块的属性为:
Group Box的属性为:
2个静态文本的属性只要改General就行啦:
2个文本编辑框也只要改General就行:
最后是list control控件的属性:
好啦,最终的效果就是这样的:前面这么啰嗦大家千万别弄错啦!接下来就是写代码啦!
3、写代码实现功能
1、变量绑定:
查看->建立类向导->Member Variables
将其设置为:
【双击对应蓝条即出现设置对话框】最后别忘点确定!
2、加入图片资源
【首先用格式工厂转换出32X32的24张bmp图片,放入工程文件的res文件中->进入Resource界面->右键Tao_Music resources->insert->弹出的对话框点击导入然后将你的24张bmp图片一个一个导入,注意这里最多每次导入8个,要分批导入!导入后的ID为IDB_BITMAP1----IDB_BITMAP24】
3、新建mp3类:
【插入->新建类】
1 //音乐播放控制类 2 3 #include "mmsystem.h"//必须同时引入 4 #pragma comment(lib,"Winmm.lib") 5 6 class mp3 7 { 8 public: 9 mp3(); 10 virtual ~mp3(); 11 HWND m_hWnd;//3个变量 12 DWORD DeviceID; 13 MCI_OPEN_PARMS mciopenparms; 14 void Load(HWND hwnd,CString Strfilepath); 15 DWORD getinformation(DWORD item); 16 void Play(); 17 void Pause(); 18 void resum(); 19 void Stop(); 20 DWORD Setvolumn(DWORD vol); 21 };
1 #include "StdAfx.h" 2 #include "mp3.h" 3 #include "Digitalv.h" 4 5 //--------------------------------------------------------------------- 6 mp3::mp3() 7 { 8 } 9 //--------------------------------------------------------------------- 10 mp3::~mp3() 11 { 12 } 13 //--------------------------------------------------------------------- 14 //加载函数 15 //--------------------------------------------------------------------- 16 void mp3::Load(HWND hwnd,CString Strfilepath) 17 { 18 //MessageBox(hwnd,Strfilepath,"43",MB_ICONHAND); 19 m_hWnd=hwnd; 20 mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备 21 mciopenparms.lpstrElementName=Strfilepath;//将音乐文件路径传给设备 22 DWORD dwReturn; 23 if (dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPVOID)&mciopenparms)) 24 { 25 //如果打开文件失败,则将出错信息储存在buffer,并显示出错警告 26 char buffer[256]; 27 mciGetErrorString(dwReturn,buffer,256); 28 //MessageBox(hwnd,buffer,"HeHe,You Are Wrong!",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP); 29 } 30 //打开文件成功就关联文件到设备 31 DeviceID=mciopenparms.wDeviceID; 32 } 33 //--------------------------------------------------------------------- 34 DWORD mp3::getinformation(DWORD item) 35 { 36 MCI_STATUS_PARMS mcistatusparms; 37 mcistatusparms.dwItem=item; 38 mcistatusparms.dwReturn=0; 39 mciSendCommand(DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms); 40 return mcistatusparms.dwReturn; 41 } 42 //--------------------------------------------------------------------- 43 //播放函数 44 //--------------------------------------------------------------------- 45 void mp3::Play() 46 { 47 MCI_PLAY_PARMS mciplayparms; 48 mciplayparms.dwCallback=(DWORD)m_hWnd; 49 mciplayparms.dwFrom=0;//每次播放都是从0开始播放 50 mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms); 51 } 52 //--------------------------------------------------------------------- 53 //暂停 54 //--------------------------------------------------------------------- 55 void mp3::Pause() 56 { 57 mciSendCommand(DeviceID,MCI_PAUSE,0,0); 58 } 59 //--------------------------------------------------------------------- 60 //重播 61 //--------------------------------------------------------------------- 62 void mp3::resum() 63 { 64 mciSendCommand(DeviceID,MCI_RESUME,0,0); 65 } 66 //--------------------------------------------------------------------- 67 //停止 68 //--------------------------------------------------------------------- 69 void mp3::Stop() 70 { 71 mciSendCommand(DeviceID,MCI_STOP,0,0); 72 mciSendCommand(DeviceID,MCI_CLOSE,0,0); 73 //当点击停止按钮时,将所有的信息都清除掉 74 } 75 //--------------------------------------------------------------------- 76 //设置音量 77 //--------------------------------------------------------------------- 78 DWORD mp3::Setvolumn(DWORD vol) 79 { 80 MCI_DGV_SETAUDIO_PARMS mcisetvolumn; 81 mcisetvolumn.dwCallback=(DWORD)m_hWnd; 82 mcisetvolumn.dwItem=MCI_DGV_SETAUDIO_VOLUME; 83 mcisetvolumn.dwValue=vol; 84 mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mcisetvolumn); 85 86 // return mcisetvolumn.dwValue; 87 return 0; 88 }
4、修改Tao_MusicDlg.h
在CTao_MusicDlg类里加入下面函数和变量
1 public: 3 void Show(int cnt); 5 void addsong(TCHAR * name); 7 void suiji(); 9 void pre(); 11 void next(); 13 void drawpic(int nTimerID); 15 BOOL AnalyseLrc(TCHAR* LrcFile);//歌词解析函数 17 BOOL DownLoad(TCHAR* Url, TCHAR* SaveName);//下载资源函数 19 bool down(TCHAR* song,TCHAR* songer,TCHAR* getstr);//下载XML资源函数 20 21 23 public: 25 int hour,minute,second; 27 CString cursong; 29 int showstr; 31 int donghuakind;//动画种类[初始化时给一个随机数,选择显示的动画种类] 33 CImageList m_imList; 35 typedef struct _LRC_INFO//定义歌词结构体 37 { 39 int Time; 41 TCHAR Lyric[256]; 43 }LRC_INFO; 45 LRC_INFO LrcInfo[500];
5、修改Tao_Music.cpp
在include下面再引入下面几个文件和库:
1 #include "mp3.h" 2 #include "mmsystem.h" 3 #include "digitalv.h" 4 #include <afxinet.h> 5 #include <shlwapi.h> 6 #pragma comment(lib,"Winmm.lib") 7 #pragma comment(lib,"wininet.lib") 8 #pragma comment(lib, "shlwapi.lib")
紧接着在全局声明一个mp3型的全局变量:
1 mp3 Mp3;
转到OnInitDialog()函数处在return 前加入如下代码:
1 // TODO: Add extra initialization here 2 SetWindowText("MP3播放器");//标题 3 m_slider.SetRange(0,1000); //移动范围 4 m_slider.SetPos(500);//滑块指针的初始位置 5 GetDlgItem(IDC_open)->EnableWindow(FALSE); 6 GetDlgItem(IDC_pause)->EnableWindow(FALSE); 7 GetDlgItem(IDC_del)->EnableWindow(FALSE); 8 //List 初始化--------------------- 9 // 设置CListCtrl控件扩展风格:整行选中子项目图标列表|LVS_EX_GRIDLINES 10 DWORD dwStyle; 11 dwStyle =m_StoreItems.GetExtendedStyle(); 12 dwStyle = dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES ; 13 m_StoreItems.SetExtendedStyle(dwStyle); 14 // 载入32*32像素 24位真彩(ILC_COLOR24)图片 15 m_imList.Create(32,32,ILC_COLOR24,10,20); // 创建图像序列CImageList对象 16 // 设置CImageList图像列表与CListCtrl控件关联 LVSIL_SMALL小图标列表 17 m_StoreItems.SetImageList(&m_imList,LVSIL_SMALL); 18 // 向列表视图控件InsertColumn插入3列数据 19 CRect mRect; 20 m_StoreItems.GetWindowRect(&mRect); // 获取控件矩形区域 21 int length = mRect.Width()-3; 22 m_StoreItems.InsertColumn(0, _T("图片"), LVCFMT_CENTER,40, -1); 23 m_StoreItems.InsertColumn(1, _T("信息"), LVCFMT_LEFT, length-60, -1); 24 //-------------- 25 cursong=""; 26 showstr=0; 27 donghuakind=rand()%4; 28 // TODO: Add extra initialization here
在文件最后依次添加如下函数:
1 //------------------------------------------------------------------------------------------------ 2 //显示函数 3 //显示cnt=0为open 4 //1为delete 5 //2为stop 6 //3为timer 7 //------------------------------------------------------------------------------------------------ 8 void CTao_MusicDlg::Show(int cnt) 9 { 10 CClientDC dc(this); 11 CString mtime; 12 TCHAR temp[19]; 13 DWORD cdf,cdfrom; 14 int showstrlen=18,i; 15 int tposx,tposy,sposx,sposy; 16 tposx=12,tposy=128; 17 sposx=12,sposy=81; 18 switch(cnt){ 19 case 0: 20 hour=0;minute=0;second=0; 21 dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观 22 dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色 23 mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度 24 dc.TextOut(tposx,tposy,mtime); 25 for(i=0;i<showstrlen;i++){ 26 temp[i]=cursong[(i+showstr)%cursong.GetLength()]; 27 }temp[i]='