C++控制台界面库_实例2: MP3播放器

需要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();

扫描二维码关注公众号,回复: 11476241 查看本文章
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;  

}

运行效果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aier_wl/article/details/107687521
今日推荐