需要MFC支持。
示例代码:
// PlayList.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h”
#include “console.h”
#pragma comment(lib,“console.lib”)
#include <Mmsystem.h>
#pragma comment(lib, “winmm.lib”)
#include <direct.h>
#include <time.h>
extern COORD mouse;
void jiemian0(); // 0
char *SelectFile(HWND hwnd);
char *SelectFolder(HWND hwnd);
class PlayMusic
{
private:
TCHAR fileName[MAX_PATH+100];
TCHAR shortName[MAX_PATH];
TCHAR cmd[MAX_PATH+250];
char buf1[260];
char st[256];
public:
int volume; // 范围: 1~1000
long sumlength,current_position;
char sumlength_ts[7],current_position_ts[7];
PlayMusic(void);
PlayMusic(char mu[]);
~PlayMusic(void);
void OpenEquipment();
void CloseEquipment();
void AssignCurrentMusic(char mu[]);
void Play();
void Stop();
void SetVolume();
void GetSumLength();
void GetCurrentPosition();
void RepeatPlay();
void PlayFrom(long position);
bool End();
};
PlayMusic::PlayMusic(void)
{
OpenEquipment();
sumlength=0;
current_position=0;
strcpy_s(sumlength_ts,7,"00:00");
}
PlayMusic::PlayMusic(char mu[])
{
OpenEquipment();
wsprintf(fileName,"%s",mu);
GetShortPathName(fileName,shortName,sizeof(shortName)/sizeof(TCHAR));
sumlength=0;
current_position=0;
strcpy_s(sumlength_ts,7,"00:00");
}
PlayMusic::~PlayMusic(void)
{
CloseEquipment();
}
void PlayMusic::OpenEquipment()
{
wsprintf(cmd,“open %s”,“waveaudio”);
mciSendString(cmd,buf1,sizeof(buf1),NULL);
}
void PlayMusic::CloseEquipment()
{
wsprintf(cmd,“close %s”,“waveaudio”);
mciSendString(cmd,buf1,sizeof(buf1),NULL);
}
void PlayMusic::AssignCurrentMusic(char mu[])
{
wsprintf(fileName,"%s",mu);
GetShortPathName(fileName,shortName,sizeof(shortName)/sizeof(TCHAR));
}
void PlayMusic::Play()
{
wsprintf(cmd,“play %s”,shortName);
mciSendString(cmd,"",NULL,NULL);
}
void PlayMusic::Stop()
{
wsprintf(cmd,“stop %s”,shortName);
mciSendString(cmd,"",NULL,NULL);
}
void PlayMusic::SetVolume()
{
wsprintf(cmd,“setaudio %s volume to %d”,shortName,volume);
mciSendString(cmd,"",NULL,NULL);
}
void PlayMusic::GetSumLength()
{
wsprintf(cmd,“status %s length”,shortName);
mciSendString(cmd,st,256,NULL);
sumlength=strtol(st, NULL, 10);
int mintue,second;
mintue=(int)(sumlength/1000/60);
second=sumlength/1000%60;
sprintf_s(sumlength_ts,7,"%02d:%02d",mintue,second);
}
void PlayMusic::GetCurrentPosition()
{
wsprintf(cmd,“status %s position”,shortName);
mciSendString(cmd,st,256,NULL);
current_position=strtol(st, NULL, 10);
int mintue,second;
mintue=(int)(current_position/1000/60);
second=current_position/1000%60;
sprintf_s(current_position_ts,7,"%02d:%02d",mintue,second);
}
void PlayMusic::RepeatPlay()
{
wsprintf(cmd,“play %s repeat”,shortName);
mciSendString(cmd,"",NULL,NULL);
}
void PlayMusic::PlayFrom(long position)
{
wsprintf(cmd,“play %s from %ld”,shortName,position);
mciSendString(cmd,"",NULL,NULL);
mciSendString(cmd,"",NULL,NULL);
}
bool PlayMusic::End()
{
if(sumlength==0)return false;
float t1;
GetCurrentPosition();
t1=(float)((sumlength-current_position)/1000.0);
if(t1<1.0)return true;
else return false;
}
BOOL AlreadyExist(char *str) //阻止程序重复运行
{
HANDLE hMutex = NULL;
hMutex = CreateMutex(NULL, FALSE, str);
if (hMutex != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return TRUE;
}
else return FALSE;
}
else return FALSE;
}
int main()
{
if(AlreadyExist(“mp3”))return 1;
Screen screen;
screen.ShowOrHideCursor(0);
screen.SetTitle(“简易mp3播放器__作者: 王力”);
Event event;
event.AddMouseMode();
jiemian0();
event.RestoreMode();
//screen.Pause();
screen.Close_handle();
return 0;
}
void jiemian0()
{
Screen screen;
screen.SetSize(84,36);
screen.Paint_screen(15);
File file;
file.Getcwd(); // 得到当前工作路径,并保存在成员变量path0中
Window window0(4,1,76,28);
window0.Paint_window(13);
Button EXIT_button=Button(76,30,"退出");
EXIT_button.Attribute(2,15);
EXIT_button.Display_button();
LinkedList_string music,music_fullname;
music.CreateFromFile("music.txt");
music_fullname.CreateFromFile("music_fullname.txt");
Listbox listbox(10,5,60,20);
listbox.Attribute(1,6,6,true,false,0);
listbox.AddLbto_ScrollListbox(music);
listbox.ScrollButtonUp.Attribute(5,15);
listbox.ScrollButtonUp.Display_button();
listbox.ScrollButtonDown.Attribute(5,15);
listbox.ScrollButtonDown.Display_button();
Window HuaDong_window=Window(listbox.cx0+listbox.wide+5,listbox.cy0+1,2,listbox.heigh-2);
HuaDong_window.window_Bgcolor_num=15,
HuaDong_window.Paint_window();
COORD start,end={0};
Button ADD_button=Button(30,30,"添加");
ADD_button.Attribute(1,15);
ADD_button.Display_button();
Button PLAY_button=Button(38,30,"播放");
PLAY_button.Attribute(1,15);
PLAY_button.Display_button();
Button STOP_button=Button(46,30,"停止");
STOP_button.Attribute(1,15);
STOP_button.Display_button();
Button ClearList_button(28,32,"清空列表");
ClearList_button.Attribute(1,15);
ClearList_button.Display_button();
Button Prev_button(38,32,"上一首");
Prev_button.Attribute(1,15);
Prev_button.Display_button();
Button Next_button(46,32,"下一首");
Next_button.Attribute(1,15);
Next_button.Display_button();
Textbox Mode_textbox(62,30,9);
Mode_textbox.Attribute(0,1,1);
Button PullDown_button=Button(Mode_textbox.cx0+Mode_textbox.wide,Mode_textbox.cy0,"︾");
PullDown_button.Attribute(0,14);
PullDown_button.Display_button();
int mode=0; // 播放模式
Mode_textbox.DisplayString_textbox("单曲播放");
screen.TextAttribute(4,13);
screen.DisplayText(8,2,"当前播放:");
Textbox CurrentPlay_textbox(18,2,54);
CurrentPlay_textbox.Attribute(2,14,14);
Slider jindu=Slider(4,30,12);
jindu.ch1_color_num=4;
jindu.ch2='O';
jindu.ch2_color_num=2;
jindu.bgcolor_num=14;
jindu.Display();
jindu.Renew_percent(0.2);
PlayMusic play;
play.volume=1+(int)(999*jindu.percent); // 音量
screen.SetTextColorAndTextBackgroundColor(4,13);
screen.MoveCursorTo(67,27);
screen.Write(play.sumlength_ts);
Slider jindu1=Slider(14,27,52);
jindu1.ch1_color_num=2;
jindu1.bgcolor_num=13;
jindu1.Display();
int index=0; // 歌曲索引
srand((unsigned)time(0));
Event event;
while(1)
{
if(event.PeekEvent())
{
start=end;
event.ReadEvent();
if(event.Mouse_Event())
{
if(EXIT_button.MousePosition_At_button()
&&event.Left_Button_Pressed())
{
play.Stop();
break;
}
if(ADD_button.MousePosition_At_button()
&&event.Left_Button_Pressed())
{
Listbox listbox1=Listbox(ADD_button.cx0-3,ADD_button.cy0+1,10,2);
Window window=Window(listbox1.cx0,listbox1.cy0,listbox1.wide,listbox1.heigh);
window.GetText_window();
listbox1.Attribute1(false,false,0);
char sex[2][100]={" 添加文件 "," 添加目录 "};
listbox1.AddArrayto_SinglePageListbox(sex,2);
int index1=100;
char drive[3],dir[256],fname[256],ext[10];
while(1)
{
event.ReadEvent();
if(event.Mouse_Event())
{
if(listbox1.MousePosition_At_listbox())
{
listbox1.index_textbox.PaintText_textbox(0,14);
event.Get_mouse_position();
listbox1.index_textbox.cy0=mouse.Y;
listbox1.index_textbox.PaintText_textbox(1,6);
if(event.Left_Button_Pressed())
{
index1=listbox1.SinglePageItemIndex();
break;
}
}
else
listbox1.index_textbox.PaintText_textbox(0,14);
if(!window.MousePosition_At_window()&&event.Left_Button_Pressed())
{
break;
}
}
}
window.PutText_window();
event.zero();
if(index1==0)
{
HWND cmd=GetConsoleWindow();
char *szFileName=SelectFile(cmd);
if(szFileName!=NULL)
{
if(!music_fullname.StringExsit(szFileName))
{
music_fullname.AddNodeAtTail(szFileName);
_splitpath_s(szFileName,drive,3,dir,256,fname,256,ext,10);
music.AddNodeAtTail(fname);
}
_chdir(file.path0);
music_fullname.SaveToFile("music_fullname.txt");
music.SaveToFile("music.txt");
listbox.AddLbto_ScrollListbox(music);
//textbox.PaintText_textbox(2,5);
}
}
if(index1==1)
{
HWND cmd=GetConsoleWindow();
char *path=SelectFolder(cmd);
if(path!=NULL)
{
LinkedList_string temp;
PNode_string temp1;
temp.CreateFromDirectory(path,"\\*.mp3",true);
temp1=temp.head;
while(temp1!=NULL)
{
if(!music_fullname.StringExsit(temp1->name))
{
music_fullname.AddNodeAtTail(temp1->name);
_splitpath_s(temp1->name,drive,3,dir,256,fname,256,ext,10);
music.AddNodeAtTail(fname);
}
temp1=temp1->next;
}
_chdir(file.path0);
music_fullname.SaveToFile("music_fullname.txt");
music.SaveToFile("music.txt");
listbox.AddLbto_ScrollListbox(music);
temp.DeleteLb();
}
}
event.FlushInputBuffer();
}
if(event.Left_Button_Pressed()&&event.Mouse_Moved())
{
event.Get_mouse_position();
end=mouse;
if(HuaDong_window.Point_At_window(start)&&HuaDong_window.Point_At_window(end))
{
if(end.Y>start.Y)for(int i=0;i<4;i++) listbox.ScrollListboxText_lb(DOWN,music);
if(end.Y<start.Y)for(int i=0;i<4;i++) listbox.ScrollListboxText_lb(UP,music);
}
}
if(listbox.ScrollButtonUp.MousePosition_At_button()
&&event.Left_Button_Pressed())
{
listbox.ScrollListboxText_lb(UP,music);
}
if(listbox.ScrollButtonDown.MousePosition_At_button()
&&event.Left_Button_Pressed())
{
listbox.ScrollListboxText_lb(DOWN,music);
}
if(event.Mouse_Wheel_Up())
{
for(int i=0;i<4;i++)listbox.ScrollListboxText_lb(UP,music);
}
if(event.Mouse_Wheel_Down())
{
for(int i=0;i<4;i++)listbox.ScrollListboxText_lb(DOWN,music);
}
if(listbox.MousePosition_At_listbox()
&&event.Left_Button_Pressed()&&!event.Mouse_Moved())
{
index=listbox.ScrollItemIndex();
listbox.index_textbox.PaintText_textbox(listbox.listbox_textcolor_num,listbox.listbox_textBgcolor_num);
event.Get_mouse_position();
listbox.index_textbox.cy0=mouse.Y;
listbox.index_textbox.wide=(int)strlen(music.NodeString(index));
listbox.index_textbox.PaintText_textbox(listbox.listbox_textBgcolor_num,listbox.listbox_textcolor_num);
//
if(event.Double_Click())
{
play.Stop();
play.AssignCurrentMusic(music_fullname.NodeString(index));
CurrentPlay_textbox.DisplayString_textbox(music.NodeString(index));
play.Play();
play.SetVolume();
play.GetSumLength();
screen.SetTextColorAndTextBackgroundColor(4,13);
screen.MoveCursorTo(67,27);
screen.Write(play.sumlength_ts);
}
}
if(listbox.MousePosition_At_listbox()
&&event.Right_Button_Pressed()&&event.Double_Click())
{
int index1=listbox.ScrollItemIndex();
music_fullname.DeleteNode(index1);
music.DeleteNode(index1);
music_fullname.SaveToFile("music_fullname.txt");
music.SaveToFile("music.txt");
listbox.AddLbto_ScrollListbox(music);
}
if(PLAY_button.MousePosition_At_button()
&&event.Left_Button_Pressed())
{
play.Stop();
play.AssignCurrentMusic(music_fullname.NodeString(index));
CurrentPlay_textbox.DisplayString_textbox(music.NodeString(index));
play.Play();
play.SetVolume();
play.GetSumLength();
screen.SetTextColorAndTextBackgroundColor(4,13);
screen.MoveCursorTo(67,27);
screen.Write(play.sumlength_ts);
}
if(STOP_button.MousePosition_At_button()
&&event.Left_Button_Pressed())
{
play.Stop();
}
if(ClearList_button.MousePosition_At_button())
{
screen.SetTextColorAndTextBackgroundColor(3,15);
screen.MoveCursorTo(26,34);
screen.Write("右键双击,删除单个文件。");
}
else
{
screen.SetTextColorAndTextBackgroundColor(3,15);
screen.MoveCursorTo(26,34);
screen.Write(" ");
}
if(ClearList_button.MousePosition_At_button()&&event.Left_Button_Pressed())
{
if(music_fullname.head!=NULL)
{
HWND cmd=GetConsoleWindow();
if(MessageBox(cmd,TEXT("Are you sure to empty?"),TEXT("清空播放列表"),MB_YESNO | MB_ICONQUESTION )==IDYES)
{
music_fullname.DeleteLb();
music.DeleteLb();
music_fullname.SaveToFile("music_fullname.txt");
music.SaveToFile("music.txt");
listbox.AddLbto_ScrollListbox(music);
}
}
event.FlushInputBuffer();
}
if(jindu.MousePostion_At_Slider())
{
if(event.Left_Button_Pressed())
{
jindu.Renew_mouse();
screen.SetTextColorAndTextBackgroundColor(4,15);
screen.MoveCursorTo(jindu.cx0+jindu.length+1,jindu.cy0);
printf("%3d%%",(int)(jindu.percent*100));
play.volume=1+(int)(999*jindu.percent);
play.SetVolume();
}
if(event.Button_Released())
{
screen.SetTextColorAndTextBackgroundColor(4,15);
screen.MoveCursorTo(jindu.cx0+jindu.length+1,jindu.cy0);
printf(" ");
}
}
if(jindu1.MousePostion_At_Slider()&&event.Left_Button_Pressed())
{
jindu1.Renew_mouse();
long position=jindu1.percent*play.sumlength;
play.PlayFrom(position);
play.SetVolume();
}
if(PullDown_button.MousePosition_At_button())
{
PullDown_button.PaintText_button(4,5);
}
else
{
PullDown_button.PaintText_button(0,14);
}
if((PullDown_button.MousePosition_At_button() || Mode_textbox.MousePosition_At_textbox())
&&event.Left_Button_Pressed())
{
Listbox listbox2(Mode_textbox.cx0,Mode_textbox.cy0+1,8,5);
Window window=Window(listbox2.cx0,listbox2.cy0,listbox2.wide,listbox2.heigh);
window.GetText_window();
listbox2.Attribute1(false,false,0);
char sex[5][100]={"单曲播放","单曲循环","顺序播放","全部循环","随机播放"};
listbox2.AddArrayto_SinglePageListbox(sex,5);
while(1)
{
event.ReadEvent();
if(event.Mouse_Event())
{
if(listbox2.MousePosition_At_listbox()
&&event.Left_Button_Pressed())
{
mode=listbox2.SinglePageItemIndex();
Mode_textbox.DisplayString_textbox(sex[mode]);
break;
}
if(!window.MousePosition_At_window()
&&event.Left_Button_Pressed())
{
break;
}
}
}
window.PutText_window();
event.zero();
}
if(Prev_button.MousePosition_At_button()&&event.Left_Button_Pressed())
{
if(index>0)
{
index--;
event.WriteEvent_button(PLAY_button);
}
}
if(Next_button.MousePosition_At_button()&&event.Left_Button_Pressed())
{
if(index<music.Length()-1)
{
index++;
event.WriteEvent_button(PLAY_button);
}
}
}
if(event.Key_Event()&&event.Key_Down())
{
char ch=event.Get_ch();
WORD vk=event.Get_vk();
if(ch=='q'||vk==VK_ESCAPE)
{
break;
}
if(vk==VK_RETURN)event.WriteEvent_button(PLAY_button);
if(vk==VK_LEFT)
{
play.GetCurrentPosition();
long position=play.current_position-(play.sumlength/jindu1.length)*2;
play.PlayFrom(position);
play.SetVolume();
}
if(vk==VK_RIGHT)
{
play.GetCurrentPosition();
long position=play.current_position+(play.sumlength/jindu1.length)*2;
play.PlayFrom(position);
play.SetVolume();
}
if(vk==VK_UP)
{
if(play.volume<1000)
{
play.volume+=1000/jindu.length;
if(play.volume>1000)play.volume=1000;
play.SetVolume();
jindu.percent=(play.volume-1)/999.0;
jindu.Renew_percent(jindu.percent);
}
}
if(vk==VK_DOWN)
{
if(play.volume>1)
{
play.volume-=1000/jindu.length;
if(play.volume<1)play.volume=1;
play.SetVolume();
jindu.percent=(play.volume-1)/999.0;
jindu.Renew_percent(jindu.percent);
}
}
}
}
play.GetCurrentPosition();
if(play.sumlength!=0)jindu1.Renew_percent((float)play.current_position/play.sumlength);
screen.SetTextColorAndTextBackgroundColor(4,13);
screen.MoveCursorTo(8,27);
screen.Write(play.current_position_ts);
if(play.End())
{
switch(mode)
{
case 0:
play.Stop();
break;
case 1:
play.RepeatPlay();
break;
case 2:
if(index<music.Length()-1)
{
index++;
event.WriteEvent_button(PLAY_button);
}
break;
case 3:
index++;
if(index>=music.Length())index=0;
event.WriteEvent_button(PLAY_button);
break;
case 4:
if(music.Length()!=0)index=(int)rand()%music.Length();
event.WriteEvent_button(PLAY_button);
break;
}
}
Sleep(100);
}
}
// Select.cpp文件
#include “stdafx.h”
#include <afxdlgs.h>
#include <shlobj.h>
char *SelectFolder(HWND hwnd)
{
char *strPath = NULL;
BROWSEINFO bInfo;
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.hwndOwner =hwnd;
bInfo.pidlRoot=CSIDL_DESKTOP;
bInfo.lpszTitle = _T("作者:王力");
bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
LPITEMIDLIST lpDlist; //用来保存返回信息的IDList
lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
if(lpDlist != NULL) //用户按了确定按钮
{
strPath=new TCHAR[256]; //用来存储路径的字符串
SHGetPathFromIDList(lpDlist, strPath);//把项目标识列表转化成字符串
}
return strPath;
}
char *SelectFile(HWND hwnd)
{
OPENFILENAME ofn;
char *szFileName=new char[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
szFileName[0] = '\0';
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "mp3 Files (*.mp3)\0*.mp3\0All Files (*.*)\0*.*\0\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "mp3";
ofn.lpstrTitle="作者:王力";
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
return szFileName;
}
else return NULL;
}
运行效果: