[MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载
》目录《
》——————————————————————《
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类:
【插入->新建类】
//音乐播放控制类 #include "mmsystem.h"//必须同时引入
#pragma comment(lib,"Winmm.lib") class mp3
{
public:
mp3();
virtual ~mp3();
HWND m_hWnd;//3个变量
DWORD DeviceID;
MCI_OPEN_PARMS mciopenparms;
void Load(HWND hwnd,CString Strfilepath);
DWORD getinformation(DWORD item);
void Play();
void Pause();
void resum();
void Stop();
DWORD Setvolumn(DWORD vol);
};
mp3.h
#include "StdAfx.h"
#include "mp3.h"
#include "Digitalv.h" //---------------------------------------------------------------------
mp3::mp3()
{
}
//---------------------------------------------------------------------
mp3::~mp3()
{
}
//---------------------------------------------------------------------
//加载函数
//---------------------------------------------------------------------
void mp3::Load(HWND hwnd,CString Strfilepath)
{
//MessageBox(hwnd,Strfilepath,"43",MB_ICONHAND);
m_hWnd=hwnd;
mciSendCommand(DeviceID,MCI_CLOSE,,);//在加载文件前先清空上一次播放的设备
mciopenparms.lpstrElementName=Strfilepath;//将音乐文件路径传给设备
DWORD dwReturn;
if (dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPVOID)&mciopenparms))
{
//如果打开文件失败,则将出错信息储存在buffer,并显示出错警告
char buffer[];
mciGetErrorString(dwReturn,buffer,);
//MessageBox(hwnd,buffer,"HeHe,You Are Wrong!",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);
}
//打开文件成功就关联文件到设备
DeviceID=mciopenparms.wDeviceID;
}
//---------------------------------------------------------------------
DWORD mp3::getinformation(DWORD item)
{
MCI_STATUS_PARMS mcistatusparms;
mcistatusparms.dwItem=item;
mcistatusparms.dwReturn=;
mciSendCommand(DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);
return mcistatusparms.dwReturn;
}
//---------------------------------------------------------------------
//播放函数
//---------------------------------------------------------------------
void mp3::Play()
{
MCI_PLAY_PARMS mciplayparms;
mciplayparms.dwCallback=(DWORD)m_hWnd;
mciplayparms.dwFrom=;//每次播放都是从0开始播放
mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);
}
//---------------------------------------------------------------------
//暂停
//---------------------------------------------------------------------
void mp3::Pause()
{
mciSendCommand(DeviceID,MCI_PAUSE,,);
}
//---------------------------------------------------------------------
//重播
//---------------------------------------------------------------------
void mp3::resum()
{
mciSendCommand(DeviceID,MCI_RESUME,,);
}
//---------------------------------------------------------------------
//停止
//---------------------------------------------------------------------
void mp3::Stop()
{
mciSendCommand(DeviceID,MCI_STOP,,);
mciSendCommand(DeviceID,MCI_CLOSE,,);
//当点击停止按钮时,将所有的信息都清除掉
}
//---------------------------------------------------------------------
//设置音量
//---------------------------------------------------------------------
DWORD mp3::Setvolumn(DWORD vol)
{
MCI_DGV_SETAUDIO_PARMS mcisetvolumn;
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); // return mcisetvolumn.dwValue;
return ;
}
mp3.cpp
4、修改Tao_MusicDlg.h
在CTao_MusicDlg类里加入下面函数和变量
public:
void Show(int cnt);
void addsong(TCHAR * name);
void suiji();
void pre();
void next();
void drawpic(int nTimerID);
BOOL AnalyseLrc(TCHAR* LrcFile);//歌词解析函数
BOOL DownLoad(TCHAR* Url, TCHAR* SaveName);//下载资源函数
bool down(TCHAR* song,TCHAR* songer,TCHAR* getstr);//下载XML资源函数 public:
int hour,minute,second;
CString cursong;
int showstr;
int donghuakind;//动画种类[初始化时给一个随机数,选择显示的动画种类]
CImageList m_imList;
typedef struct _LRC_INFO//定义歌词结构体
{
int Time;
TCHAR Lyric[];
}LRC_INFO;
LRC_INFO LrcInfo[];
5、修改Tao_Music.cpp
在include下面再引入下面几个文件和库:
#include "mp3.h"
#include "mmsystem.h"
#include "digitalv.h"
#include <afxinet.h>
#include <shlwapi.h>
#pragma comment(lib,"Winmm.lib")
#pragma comment(lib,"wininet.lib")
#pragma comment(lib, "shlwapi.lib")
紧接着在全局声明一个mp3型的全局变量:
mp3 Mp3;
转到OnInitDialog()函数处在return 前加入如下代码:
// TODO: Add extra initialization here
SetWindowText("MP3播放器");//标题
m_slider.SetRange(,); //移动范围
m_slider.SetPos();//滑块指针的初始位置
GetDlgItem(IDC_open)->EnableWindow(FALSE);
GetDlgItem(IDC_pause)->EnableWindow(FALSE);
GetDlgItem(IDC_del)->EnableWindow(FALSE);
//List 初始化---------------------
// 设置CListCtrl控件扩展风格:整行选中\子项目图标列表|LVS_EX_GRIDLINES
DWORD dwStyle;
dwStyle =m_StoreItems.GetExtendedStyle();
dwStyle = dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES ;
m_StoreItems.SetExtendedStyle(dwStyle);
// 载入32*32像素 24位真彩(ILC_COLOR24)图片
m_imList.Create(,,ILC_COLOR24,,); // 创建图像序列CImageList对象
// 设置CImageList图像列表与CListCtrl控件关联 LVSIL_SMALL小图标列表
m_StoreItems.SetImageList(&m_imList,LVSIL_SMALL);
// 向列表视图控件InsertColumn插入3列数据
CRect mRect;
m_StoreItems.GetWindowRect(&mRect); // 获取控件矩形区域
int length = mRect.Width()-;
m_StoreItems.InsertColumn(, _T("图片"), LVCFMT_CENTER,, -);
m_StoreItems.InsertColumn(, _T("信息"), LVCFMT_LEFT, length-, -);
//--------------
cursong="";
showstr=;
donghuakind=rand()%;
// TODO: Add extra initialization here
在文件最后依次添加如下函数:
//------------------------------------------------------------------------------------------------
//显示函数
//显示cnt=0为open
//1为delete
//2为stop
//3为timer
//------------------------------------------------------------------------------------------------
void CTao_MusicDlg::Show(int cnt)
{
CClientDC dc(this);
CString mtime;
TCHAR temp[];
DWORD cdf,cdfrom;
int showstrlen=,i;
int tposx,tposy,sposx,sposy;
tposx=,tposy=;
sposx=,sposy=;
switch(cnt){
case :
hour=;minute=;second=;
dc.SetBkColor(RGB(,,));//设置放置计数器区域的外观
dc.SetTextColor(RGB(,,));//设置数字显示的颜色
mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度
dc.TextOut(tposx,tposy,mtime);
for(i=;i<showstrlen;i++){
temp[i]=cursong[(i+showstr)%cursong.GetLength()];
}temp[i]='\0';
showstr=(showstr+)%cursong.GetLength();
mtime.Format("---------------------------- ");//覆盖上次显示
dc.TextOut(sposx,sposy,mtime);
dc.TextOut(sposx,sposy,temp);
break;
case :
dc.TextOut(sposx,sposy,"");
KillTimer();
KillTimer();
KillTimer();
hour=;minute=;second=;//歌曲时间置0
break;
case :
KillTimer();//取消计数器的显示
KillTimer();
KillTimer();
hour=;minute=;second=;
dc.SetBkColor(RGB(,,));//设置放置计数器区域的外观
dc.SetTextColor(RGB(,,));//设置数字显示的颜色
mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度
dc.TextOut(tposx,tposy,mtime);
for(i=;i<showstrlen;i++){
temp[i]=cursong[(i+showstr)%cursong.GetLength()];
}temp[i]='\0';
showstr=(showstr+)%cursong.GetLength();
mtime.Format("---------------------------- ");//覆盖上次显示
dc.TextOut(sposx,sposy,mtime);
dc.TextOut(sposx,sposy,temp);
break;
case :
second++;
dc.SetBkColor(RGB(,,));//设置放置计数器区域的外观
dc.SetTextColor(RGB(,,));//设置数字显示的颜色
if(second==){//设置钟表的显示
minute++;second=;
}if(minute==){
hour++;minute=;
}
//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)){//如果停止就进行换歌
CString strtemp;
GetDlgItemText(IDC_exit,strtemp);//获取按钮状态
if (strtemp.Compare("单曲")==){
Mp3.Setvolumn(-m_slider.GetPos());//声音设为滑块指示的地方
Mp3.Load(this->m_hWnd,cursong);
Mp3.Play();
hour=;minute=;second=;
}else if(strtemp.Compare("顺序")==){
next();
}else if(strtemp.Compare("随机")==){
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//,cdf/%);
dc.TextOut(tposx,tposy,mtime);
for(i=;i<showstrlen;i++){
temp[i]=cursong[(i+showstr)%cursong.GetLength()];
}temp[i]='\0';
showstr=(showstr+)%cursong.GetLength();
mtime.Format("---------------------------- ");//覆盖上次显示
dc.TextOut(sposx,sposy,mtime);
dc.TextOut(sposx,sposy,temp);
break;
default:break;
}
}
//------------------------------------------------------------------------------------------------
//添加歌词
//------------------------------------------------------------------------------------------------
void CTao_MusicDlg::addsong(TCHAR * name)
{
//wsprintf(strNumber,_T("IDB_BITMAP%d"),rand()%24+162);
CBitmap * pBmp = NULL;
pBmp = new CBitmap();
pBmp->LoadBitmap(rand()%+IDB_BITMAP1); // 载入位图162
m_imList.Add(pBmp,RGB(,,));
delete pBmp; // 添加数据 InsertItem向列表中插入主项数据 SetItemText向列表中的子项写入数据
LVITEM lvItem={}; // 列表视图控 LVITEM用于定义"项"的结构
lvItem.mask = LVIF_IMAGE|LVIF_TEXT; // 文字、图片
lvItem.iItem = m_StoreItems.GetItemCount(); // 行号
lvItem.iImage = m_StoreItems.GetItemCount(); // 图片索引号(第一幅图片 IDB_BITMAP1)
lvItem.iSubItem = ; // 子列号
m_StoreItems.InsertItem(&lvItem); // 第一列为图片
m_StoreItems.SetItemText(m_StoreItems.GetItemCount()-,,name); // 第二列为名字
}
//------------------------------------------------------------------------------------------------
//随机函数
//------------------------------------------------------------------------------------------------
void CTao_MusicDlg::suiji()
{
int index=m_StoreItems.GetSelectionMark();//获取选中的文本
if(index==-)
{
MessageBox("请添加音乐");
return;
}
index=rand()%m_StoreItems.GetItemCount();
CString strfilename;
char str[];
m_StoreItems.GetItemText(index,,str,sizeof(str));
strfilename.Format(_T("%s"),str);
cursong=strfilename; m_StoreItems.EnsureVisible(index,FALSE);//选中
m_StoreItems.SetItemState(index,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); //选中行
m_StoreItems.SetSelectionMark(index);
m_StoreItems.SetFocus(); //SetDlgItemText(IDC_filename,strfilename);
Mp3.Stop();
Mp3.Load(this->m_hWnd,strfilename);
Mp3.Play();
Mp3.Setvolumn(-m_slider.GetPos());//声音设为滑块指示的地方
SetTimer(,,NULL);
SetTimer(,,NULL);
SetTimer(,,NULL); GetDlgItem(IDC_open)->EnableWindow(TRUE);
GetDlgItem(IDC_pause)->EnableWindow(TRUE);
GetDlgItem(IDC_del)->EnableWindow(TRUE); Show();
}
//------------------------------------------------------------------------------------------------
//上一曲
//------------------------------------------------------------------------------------------------
void CTao_MusicDlg::pre()
{
int index=m_StoreItems.GetSelectionMark();//获取选中的文本
if(index==-)
{
MessageBox("请添加音乐");
return;
}
index=(index-+m_StoreItems.GetItemCount())%m_StoreItems.GetItemCount();
CString strfilename;
char str[];
m_StoreItems.GetItemText(index,,str,sizeof(str));
strfilename.Format(_T("%s"),str);
cursong=strfilename; m_StoreItems.EnsureVisible(index,FALSE);//选中
m_StoreItems.SetItemState(index,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); //选中行
m_StoreItems.SetSelectionMark(index);
m_StoreItems.SetFocus(); //SetDlgItemText(IDC_filename,strfilename);
Mp3.Stop();
Mp3.Load(this->m_hWnd,strfilename);
Mp3.Play();
Mp3.Setvolumn(-m_slider.GetPos());//声音设为滑块指示的地方
SetTimer(,,NULL);
SetTimer(,,NULL);
SetTimer(,,NULL); GetDlgItem(IDC_open)->EnableWindow(TRUE);
GetDlgItem(IDC_pause)->EnableWindow(TRUE);
GetDlgItem(IDC_del)->EnableWindow(TRUE); Show();
}
//------------------------------------------------------------------------------------------------
//下一曲
//------------------------------------------------------------------------------------------------
void CTao_MusicDlg::next()
{
int index=m_StoreItems.GetSelectionMark();//获取选中的文本
if(index==-)
{
MessageBox("请添加音乐");
return;
}
index=(index+)%m_StoreItems.GetItemCount();
CString strfilename;
char str[];
m_StoreItems.GetItemText(index,,str,sizeof(str));
strfilename.Format(_T("%s"),str);
cursong=strfilename; m_StoreItems.EnsureVisible(index,FALSE);//选中
m_StoreItems.SetItemState(index,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); //选中行
m_StoreItems.SetSelectionMark(index);
m_StoreItems.SetFocus(); //SetDlgItemText(IDC_filename,strfilename);
Mp3.Stop();
Mp3.Load(this->m_hWnd,strfilename);
Mp3.Play();
Mp3.Setvolumn(-m_slider.GetPos());//声音设为滑块指示的地方
SetTimer(,,NULL);
SetTimer(,,NULL);
SetTimer(,,NULL); GetDlgItem(IDC_open)->EnableWindow(TRUE);
GetDlgItem(IDC_pause)->EnableWindow(TRUE);
GetDlgItem(IDC_del)->EnableWindow(TRUE); Show();
}
//----------------------------------------------------------------------
//解析歌词
//----------------------------------------------------------------------
BOOL CTao_MusicDlg::AnalyseLrc(TCHAR* LrcFile)
{
//读取文件到缓冲区中
TCHAR* LrcBuf = NULL;
FILE* fp = fopen(LrcFile, "rb");
if( fp == NULL){
return FALSE;
}
fseek(fp, 0L, SEEK_END);
long LrcLen = ftell(fp);
if(LrcLen == ){
return FALSE;
}
LrcBuf = (TCHAR*) malloc(sizeof(TCHAR) * LrcLen + ); //开辟缓冲区
if(LrcBuf == NULL){
return FALSE;
}
fseek(fp, 0L, SEEK_SET);
fread(LrcBuf, LrcLen + , , fp);
if(LrcBuf == NULL){
return FALSE;
}
fclose(fp);
//分析缓冲区中内容
TCHAR *p1 = NULL;
TCHAR *p2 = NULL;
int m, n;
int i, j = ;
TCHAR* Lrc = LrcBuf;
TCHAR CurTime[];
TCHAR Lyric[];
int nCurTime;
while(){
//解析时间
p1 = strchr(Lrc, '[');
m = p1-Lrc;
p2 = strchr(Lrc, ']');
n = p2-Lrc;
for(i = m + ; i < n; i++){
CurTime[i - m - ] = Lrc[i];
}
CurTime[i - m - ] = '\0';
//解析歌词
Lrc = p2;
p1 = strchr(Lrc, ']');
m = p1-Lrc;
p2 = strchr(Lrc, '[');
n = p2-Lrc; for( i = m + ; i < n; i++){
Lyric[i - m - ] = Lrc[i];
}
Lyric[i - m - ] = '\0'; if(p2 == NULL){
break;
}
Lrc = p2;
if(lstrlen(Lyric) == || lstrlen(Lyric) == ){
continue;
}
//计算时间
TCHAR* ptime = strchr(CurTime, ':');
int k = ptime-CurTime;
TCHAR temp[];
for(i = k + ; i < lstrlen(CurTime); i++){
temp[i - k - ] = CurTime[i];
}
temp[i - k - ] = '\0';
nCurTime = (((CurTime[] - '') * + (CurTime[] - '')) * + atoi(temp) ) * ; LrcInfo[j].Time = nCurTime;
lstrcpy(LrcInfo[j].Lyric, Lyric);
j++;
}
free(LrcBuf);
LrcBuf = NULL;
return TRUE;
}
//----------------------------------------------------------------------
//下载资源函数
//----------------------------------------------------------------------
BOOL CTao_MusicDlg::DownLoad(TCHAR* Url, TCHAR* SaveName)
{
DWORD byteread = ;
TCHAR buffer[];
memset(buffer, ,);
HINTERNET internetopen;
internetopen =InternetOpen("Testing", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, ); if (internetopen == NULL){
return FALSE;
} HINTERNET internetopenurl;
internetopenurl = InternetOpenUrl(internetopen, Url, NULL, , INTERNET_FLAG_RELOAD, );
if (internetopenurl == NULL){
InternetCloseHandle(internetopen);
return FALSE;
}
BOOL hwrite;
DWORD written; HANDLE createfile;
createfile = CreateFile(SaveName, GENERIC_WRITE, , , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, );
if (createfile == INVALID_HANDLE_VALUE){
InternetCloseHandle(internetopenurl);
return FALSE;
}
BOOL internetreadfile;
while(){
internetreadfile = InternetReadFile(internetopenurl, buffer, sizeof(buffer), &byteread);
if(byteread==)
break;
hwrite = WriteFile(createfile, buffer, sizeof(buffer), &written, NULL);
if (hwrite == ){
CloseHandle(createfile);
return FALSE;
}
}
CloseHandle(createfile);
return TRUE;
}
//----------------------------------------------------------------------
//下载XML保存在getstr里
//----------------------------------------------------------------------
bool CTao_MusicDlg::down(TCHAR* song,TCHAR* songer,TCHAR* getstr)
{
//http://box.zhangmen.baidu.com/x?op=12&count=1&title=歌曲$$歌手$$$$
TCHAR* Url=new TCHAR[strlen(song)+strlen(songer)+];
sprintf(Url,"http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$%s$$$$",song,songer); DWORD byteread = ;
TCHAR buffer[];
memset(buffer, ,);
HINTERNET internetopen;
internetopen =InternetOpen("Testing", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, );
if (internetopen == NULL){
delete[] Url;
return FALSE;
}
HINTERNET internetopenurl;
internetopenurl = InternetOpenUrl(internetopen, Url, NULL, , INTERNET_FLAG_RELOAD, );
if (internetopenurl == NULL){
InternetCloseHandle(internetopen);
delete[] Url;
return FALSE;
} while()
{
InternetReadFile(internetopenurl, buffer, sizeof(buffer), &byteread);
if(byteread==)
break;
sprintf(getstr,"%s",buffer);
}
delete[] Url;
return TRUE;
}
其它函数
6、功能实现:
进入form界面:双击添加按钮:
点击ok在新产生的函数中加入代码:
CFileDialog dlg(TRUE);//打开CFileDialog对象
dlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT |
OFN_ENABLESIZING |
OFN_HIDEREADONLY;
dlg.m_ofn.lpstrFilter = _T("Mp3 Files(*.mp3)\0*.mp3\0Wave Audio Files(*.wav)\0*.wav\0MIDI Files(*.mid)\0*.mid\0AVI Files(*.avi)\0*.avi\0All Files(*.*)\0*.*\0\0");
dlg.m_ofn.lpstrTitle="添加音乐";
dlg.m_ofn.nMaxFile=*MAX_PATH;//最多100个文件
dlg.m_ofn.lpstrFile =new TCHAR[dlg.m_ofn.nMaxFile];
ZeroMemory(dlg.m_ofn.lpstrFile,sizeof(TCHAR)*dlg.m_ofn.nMaxFile); //显示文件对话框,获得文件名集合
int retval=dlg.DoModal(); if(retval==IDCANCEL)return;
if (retval==IDOK)
{
int i = ;
CString strfilepath[];
CString strfilename[];
POSITION pos = dlg.GetStartPosition();//获取第一个文件位置
while (pos)
{
strfilename[i] = dlg.GetNextPathName(pos);
char *str=(LPSTR)(LPCTSTR)strfilename[i];
addsong(str);//加入mylist列表
i++;
}
//实现和上面功能一样的代码:转到+选中+高亮
m_StoreItems.EnsureVisible(m_StoreItems.GetItemCount()-,FALSE);
m_StoreItems.SetItemState(m_StoreItems.GetItemCount()-,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); //选中行
m_StoreItems.SetSelectionMark(m_StoreItems.GetItemCount()-);
m_StoreItems.SetFocus(); GetDlgItem(IDC_open)->EnableWindow(TRUE);
GetDlgItem(IDC_del)->EnableWindow(TRUE);
}
delete[] dlg.m_ofn.lpstrFile;
哈哈,运行一下看看第一个按钮的功能实现没!!!
同样第二个按钮有:
UpdateData(TRUE); int index=m_StoreItems.GetSelectionMark();//获取选中的文本
CString strfilename;
char str[];
m_StoreItems.GetItemText(index,,str,sizeof(str));
strfilename.Format(_T("%s"),str);
if(strfilename==cursong){//如果删除的是当前歌曲则停止
Mp3.Stop();
//SetDlgItemText(IDC_filename,"");
Show();
}
if(index!=CB_ERR)
{
m_StoreItems.DeleteItem(index);
if(m_StoreItems.GetItemCount()){//选中下一个
//实现和上面功能一样的代码:转到+选中+高亮
m_StoreItems.EnsureVisible(index%m_StoreItems.GetItemCount(),FALSE);
m_StoreItems.SetItemState(index%m_StoreItems.GetItemCount(),LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); //选中行
m_StoreItems.SetSelectionMark(index%m_StoreItems.GetItemCount());
m_StoreItems.SetFocus();
}else{
GetDlgItem(IDC_del)->EnableWindow(FALSE);//失能暂停键
}
}
第3个按钮:
pre();
第4个按钮:
int index=m_StoreItems.GetSelectionMark();
if(index==-)
{
MessageBox("请添加音乐");
return;
}
CString strfilename;
char str[];
m_StoreItems.GetItemText(index,,str,sizeof(str));
strfilename.Format(_T("%s"),str);
cursong=strfilename;
Mp3.Stop();
Mp3.Load(this->m_hWnd,strfilename);
Mp3.Play();
Mp3.Setvolumn(-m_slider.GetPos());//声音设为滑块指示的地方
SetTimer(,,NULL);
SetTimer(,,NULL);
SetTimer(,,NULL); GetDlgItem(IDC_open)->EnableWindow(TRUE);
GetDlgItem(IDC_pause)->EnableWindow(TRUE);
GetDlgItem(IDC_del)->EnableWindow(TRUE); Show();
第5个按钮:
next();
第6个按钮:
// TODO: Add your control notification handler code here
CString strtemp;
GetDlgItemText(IDC_pause,strtemp);//获取按钮状态
if (strtemp.Compare("暂停")==)
{
Mp3.Pause();
SetDlgItemText(IDC_pause,"继续");
KillTimer();//取消计数器的显示
KillTimer();
KillTimer();
}
if (strtemp.Compare("继续")==)
{
Mp3.resum();
SetTimer(,,NULL);
SetTimer(,,NULL);
SetTimer(,,NULL);
SetDlgItemText(IDC_pause,"暂停");
}
第7个按钮:
CString strtemp;
GetDlgItemText(IDC_exit,strtemp);//获取按钮状态
if (strtemp.Compare("单曲")==){
SetDlgItemText(IDC_exit,"顺序");
}else if(strtemp.Compare("顺序")==){
SetDlgItemText(IDC_exit,"随机");
}else if(strtemp.Compare("随机")==){
SetDlgItemText(IDC_exit,"单曲");
}
第8个按钮:
TCHAR* str=new TCHAR[];
TCHAR songdown[];
TCHAR cidown[];
GetDlgItemText(IDC_SONG,m_song);
GetDlgItemText(IDC_SONGER,m_songer);
if(down((LPSTR)(LPCTSTR)m_song,(LPSTR)(LPCTSTR)m_songer,str)){
int i,j;
int thisnum=;//计算'<'括号数
for(i=;i<strlen(str);i++){
if(str[i]=='<'){
thisnum++;
if(thisnum==){//第4个括号前是否为1判断是否有资源
if(str[i-]==''){
MessageBox((LPSTR)(LPCTSTR)("木有 : "+m_songer+"--"+m_song),"Tao Tao Say",MB_ICONHAND|MB_ICONWARNING);
break;
}
}else if(thisnum==){//第7个括号时判断是否出现http
while(str[i]!='h')i++;//找到开始位置
j=i;//找结束的']'及保存最后一个斜杠的位置
int endpos;
while(str[j]!=']'){
songdown[j-i]=str[j];//先把所有[]中的数据放入songdown中
if(str[j]=='/')endpos=j;
j++;
}
//i=j;//优化
j=endpos-i+;//将songdown指针放在最后一个斜杠之后
}else if(thisnum==){//第10个<时接上要下载的内容
int from=j;
for(j=;;j++){
if(str[j+i+]==']'){
i=j+i+;
songdown[j+from]='\0';
break;
}
songdown[j+from]=str[j+i+];
}
}else if(thisnum==){//第14个取得歌词地址
int sumnum=;
for(j=i+;;j++){
if(str[j]=='<'){
sprintf(cidown,"http://box.zhangmen.baidu.com/bdlrc/%d/%d.lrc",sumnum/,sumnum);
break;
}
sumnum*=;
sumnum+=(int)(str[j]-'');
}
}else if(thisnum>){
break;
}
}
}
CClientDC dc(this);
delete[] str; CString strFolderPath="D:\\Tao_Music";//判断是否有相应的文件夹,没有则创建
if(!PathIsDirectory(strFolderPath))
{
while(!CreateDirectory(strFolderPath,NULL)){}
} if(DownLoad(cidown,(LPSTR)(LPCTSTR)("D:\\Tao_Music\\"+m_song+".txt"))
&&DownLoad(songdown,(LPSTR)(LPCTSTR)("D:\\Tao_Music\\"+m_song+".mp3"))){
//dc.TextOut(20,160,cidown);
//dc.TextOut(20,120,songdown);
addsong((LPSTR)(LPCTSTR)("D:\\Tao_Music\\"+m_song+".mp3"));//加入mylist列表
//实现和上面功能一样的代码:转到+选中+高亮
m_StoreItems.EnsureVisible(m_StoreItems.GetItemCount()-,FALSE);
m_StoreItems.SetItemState(m_StoreItems.GetItemCount()-,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); //选中行
//m_StoreItems.SetSelectionMark(m_StoreItems.GetItemCount()-1);
m_StoreItems.SetFocus();
AnalyseLrc((LPSTR)(LPCTSTR)("D:\\Tao_Music\\"+m_song+".txt"));
}
}
到目前为止已经可以搜索、加载音乐播放、暂停....功能都有啦!
似乎音量还不能起作用,下面的列表不能双击播放【上面的显示条有点偏上,大家可以调一下上面的按钮,使两个文本条带正好在黑框里,也可以改动代码,代码在show函数里,通过改动 int tposx,tposy,sposx,sposy;四个变量的值来控制文本显示位置,其中t开头的控制下面的,s开头的控制上面的】
7、加一个TImer消息使时间跑起来!
查看->类向导->Message Maps->在Messages中找到WM_TIMER双击,在Member functions将出现对应的消息函数:
双击对应函数,进入代码编辑区:
加入代码:
if(nIDEvent==)Show();
现在时间可以跑啦!
8、给list添加消息函数,使双击可以播放:
点击ok接着双击Member Function对应的函数进入代码编辑区:加入代码:
// TODO: Add your control notification handler code here
int index=m_StoreItems.GetSelectionMark();//获取选中的文本
CString strfilename;
char str[];
m_StoreItems.GetItemText(index,,str,sizeof(str));
strfilename.Format(_T("%s"),str);
cursong=strfilename; //SetDlgItemText(IDC_filename,strfilename);
Mp3.Stop();
Mp3.Load(this->m_hWnd,strfilename);
Mp3.Play();
Mp3.Setvolumn(-m_slider.GetPos());//声音设为滑块指示的地方
SetTimer(,,NULL);
SetTimer(,,NULL);
SetTimer(,,NULL); GetDlgItem(IDC_open)->EnableWindow(TRUE);
GetDlgItem(IDC_pause)->EnableWindow(TRUE);
//GetDlgItem(IDC_stop)->EnableWindow(TRUE);
GetDlgItem(IDC_del)->EnableWindow(TRUE); Show();
*pResult = ;
9、给音量控制滑块加消息,使音量控制实现
双击member function对应的函数,进入代码编辑区,加入代码:
Mp3.Setvolumn(-m_slider.GetPos());
UpdateData(false);
双击member function对应的函数,进入代码编辑区,加入代码:
Mp3.Setvolumn(-m_slider.GetPos());
编译运行完工!
哈哈,终于所有的任务完成,编译运行,听听自己做的音乐播放器咋样!【如果想加一个最小化按钮,就点击form的属性,做相应的修改】
[MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载的更多相关文章
- iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码
iOS精选源码 微信自定义搜索框实现 一个商城Demo,持续更新中 在Object-C中学习数据结构与算法之排序算法 iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果 XLsn0wPushTimePi ...
- 酷狗、QQ、天天动听——手机音乐播放器竞品对比
如果说什么艺术与人们生活最贴近,那应该属音乐了,因此当代人不离身的手机里必然会有自己喜欢的音乐播放器APP存在. 在当今无论PC端还是手机端音乐播放器都越来越同质化,我们应该选择哪款手机音乐播放器?它 ...
- android 音乐播放器总结
学习从模仿開始 一个星期完毕的音乐播放器基本功能,具有下一首,上一首,暂停和随机.顺序和单曲等播放.以及保存上一次播放的状态,缺少了歌词显示功能.使用了andbase框架的欢迎动画和界面title. ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块制作 MP3 音乐播放器
利用 music 对象来制作一个 MP3 音乐播放器 . 应用程序总览 从歌曲清单中选择指定的歌曲,单击“播放”按钮可开始播放, 在播放 xxx 歌曲”的信息. 歌曲播放的过程中,可以暂停.停止,也可 ...
- android音乐播放器开发教程
android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...
- SE Springer小组之《Spring音乐播放器》可行性研究报告三、四
3 对现有系统的分析 由于本次可行性分析主要是建立在团队自行实现一个音乐软件的目标上,并不是在一个现有系统的基础上开发改进的新系统.因此这里将分析一款市面上已经存在的音乐软件(以下称为W音乐),并为之 ...
- android 音乐播放器
本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...
- 基于Qt Phonon模块实现音乐播放器
这次使用Qt实现的是一个本地音乐播放器,可以播放下载在计算机本地的音乐,提供了添加歌曲,歌曲列表,清空列表的功能.默认歌曲列表循环播放.音乐播放的实现主要依赖的是Qt 的多媒体框架phonon.该音乐 ...
- 10个免费开源的JS音乐播放器插件
点这里 音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候. 下面整理的播放器有些是支持自适应的, ...
随机推荐
- 命令行启动win7系统操作部分功能
control.exe /name microsoft.folderoptions 启动资源管理器的 文件夹属性 选项卡 control.exe /name Microsoft.AddHardware ...
- {CSDN}{英雄会}{反相互}
思路: 给定一个字符串,求两个不重叠的字串,他们翻转互补.其中一个字符串可以是删掉最多两个字符的原字符串子串. 动态规划,由于可以对子串进行删除操作,我首先想到了LCS问题,但需要枚举所有的长度,这样 ...
- maven 加入本地jar包
Apache Maven,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建.报告和文档等步骤.曾是Jakarta项目的子项目,现 ...
- C++ 一个程序获取另一个程序Edit控件的内容
//一个程序获取另一个程序Edit控件的内容 //根据指定程序的标题名获取改程序窗口的句柄 HWND hWnd=::FindWindow(NULL,"zhang001"); if( ...
- VC++ 用setsockopt()来控制recv()与send()的超时
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 以下是来自于网上一篇文章中的摘录,它是这样写的: ;//1秒, //设置发送超时 setsockopt ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- 用window.showModelDialog() 打开的页面的返回值
有两个页面也个 Default1.aspx 另外一个是 Default2.aspx Default1.aspx 有个按钮是用来打开Default2.aspx页面的 按钮的js代码是 var win ...
- poj 2239 Selecting Courses (二分匹配)
Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8316 Accepted: 3687 ...
- CSS线性渐变
/*CSS线性渐变*/ FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#ffffff, ...
- VS2013中,RDLC设置数据源和参数的界面
今天打开RDLC文件设置参数和数据源时,始终找不到那个窗口,原来那个窗口叫“报表数据”,在“视图”菜单的最下面! 另外:要在当前窗口时打开的RDLC文件时,视图下面才有该选项!!! 参考:http:/ ...