自己动手开发音乐播放器《五》播放功能的实现

小伙伴们注意了,我在上一篇博客介绍了文件操作,在这篇博客中将接受音乐播放器的核心功能,播放、暂停、停止、继续、上一曲、下一曲等功能,在这些功能中会用到一个非常重要的函数mmciSendString,mciSendString函数是一个处理多媒体文件的函数,其中音乐播放器中的播放、暂停、停止、等功能都需要用到这个函数,居然这个函数这么重要,我们就来看看这个函数的用法,


函数原型:

MCIERROR mciSendString(
  LPCTSTR lpszCommand,    命令字符串
  LPTSTR lpszReturnString,   返回的字符串
  UINT cchReturn,                   返回字符串的大小
  HANDLE hwndCallback        回调句柄(一般为NULL)
);


其中的第一个参数的格式:

播放命令+音乐文件

如:mciSendString("play D:\\1.mp3",NULL,0,NULL);

中 play表示播放命令    D:\\1.mp3表示音乐文件


在写代码前先定义一些全局变量和函数

全局变量

/**************************************************************************
                播放歌曲所需的全局变量
****************************************************************************/
static int numPlayMusicNow = 0;//正在播放的歌曲的序号


PlayMusic函数用于播放音乐

/****************************************************************************
                 函数名:   void PlayMusic(HWND hwnd)
				 函数功能: 播放歌曲
****************************************************************************/
void PlayMusic(HWND hwnd)
{
	TCHAR cmd[MAX_PATH];//保存播放歌曲的命令

	//打印关闭歌曲的命令
	wsprintf(cmd,"close %s",OpenMusicFile);

	///发送关闭歌曲的命令
	mciSendString(cmd, "", 0, NULL);

	GetMusic(hwnd);//得到选择的歌曲

	//显示正在播放的歌曲
	SetDlgItemText(hwnd,IDC_PLAYEDIT,line);

	wsprintf(cmd,"open %s alias",OpenMusicFile);

	mciSendString(cmd,0,0,NULL);

	//打印播放歌曲的命令
	wsprintf(cmd,"play %s",OpenMusicFile);

	//发送播放歌曲的命令
	mciSendString(cmd,0,0,NULL);
}


然后在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

		//播放歌曲
		case IDC_PLAY:
		{
			PlayMusic(hwnd);
		}
		break;
		

运行结果(播放成龙的少年强)

自己动手开发音乐播放器《五》播放功能的实现_第1张图片


暂停的实现代码暂停和播放类似也是定义一些全局变量和函数

首先定义一个全局变量

/***********************************************************************************************
        实现暂停播放所需的全局变量
*************************************************************************************************/
static int flagPauseOrPlay = 0;//暂停播放的标志位(歌曲是暂停还是播放)

然后定义一个函数PauseMusic实现暂停播放

/**********************************************************************************************
                 函数名:   void PauseMusic(HWND hwnd)
				 函数功能:  暂停歌曲
***********************************************************************************************/
void PauseMusic(HWND hwnd)
{
	//得到暂停按钮上的句柄
	HWND hwndPause = GetDlgItem(hwnd,IDC_PAUSE);

	TCHAR cmd[256];

	//当按下了继续按钮
	if(1 == flagPauseOrPlay)
	{
		//继续按钮变成暂停按钮
		SetWindowText(hwndPause,TEXT("暂停"));

		//打印播放命令
		wsprintf(cmd,"play %s",OpenMusicFile);

		//发送播放命令
		mciSendString(cmd,NULL,0,0);

	//修改标志位(表示用户按下了继续按钮)
		flagPauseOrPlay = 0;
	}

	else if(0 == flagPauseOrPlay)//当按了暂停后
	{
		//暂停按钮变成继续按钮
		SetWindowText(hwndPause,TEXT("继续"));

		//打印暂停命令
		wsprintf(cmd,"pause %s",OpenMusicFile);

		//执行暂停命令
		mciSendString(cmd,NULL,0,0);

		//修改标志位(表示用户按下了暂停按钮)
		flagPauseOrPlay = 1;
	}
}

最后在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

		//暂停
		case IDC_PAUSE:
		{
			PauseMusic(hwnd);
		}
		break;

实现效果

自己动手开发音乐播放器《五》播放功能的实现_第2张图片

自己动手开发音乐播放器《五》播放功能的实现_第3张图片


停止播放的实现

/***********************************************************************************************
           函数名:void StopMusic(HWND hwnd)
		   函数功能:停止播放
************************************************************************************************/
void StopMusic(HWND hwnd)
{
	TCHAR cmd[256];

	wsprintf(cmd,"stop %s",OpenMusicFile);

	mciSendString(cmd,NULL,0,0);
}


在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

		//停止
		case IDC_STOP:
		{
			StopMusic(hwnd);
		}
		break;


上一曲或下一曲的实现

全局变量

/****************************************************************************************************************
                 实现上一曲和下一曲所需的全局变量
*****************************************************************************************************************/
static int totalMusicCount;//播放列表中歌曲的总数

static NumPlayMusicNow;//选择歌曲的编号

static int iLoopType = 0;//播放方式:初始为单曲模式

函数

/***********************************************************************************************
             函数名:   void JumpMusic(HWND hwnd,int num)
			 函数功能: 实现上一曲(num=0)或下一曲(num=1)
************************************************************************************************/
void JumpMusic(HWND hwnd,int num)
{
	HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

	//得到选择的歌曲的序号
	numPlayMusicNow = ListBox_GetCurSel(hwndList);

	//得到歌曲总数
	totalMusicCount = ListBox_GetCount(hwndList);


/*下面的代码是处理随机播放中的上一曲和下一曲*/

	if(0==num)//上一曲
	{
		//随机播放
		if(3 == iLoopType)
		{
			//随机生成歌曲的序号
			numPlayMusicNow = rand() % totalMusicCount;
		}
		else
		{
			//当正在播放的歌曲的序号大于0时
			if(numPlayMusicNow > 0)
			{
				//上一曲
				numPlayMusicNow = numPlayMusicNow - 1;
			}
			else if(0 == numPlayMusicNow)//当在播放第1首歌时
			{
				//跳到最后一首歌曲
				numPlayMusicNow = totalMusicCount - 1;
			}

		}
	}
	else if(1 == num)//下一曲
	{
		if(3 == iLoopType)
		{
	       //随机生成歌曲的序号
			numPlayMusicNow = rand() % totalMusicCount;
		}
		else 
		{
			//当正在播放的歌曲的序号小于歌曲的最大序号时
			if(numPlayMusicNow < totalMusicCount - 1)
			{
				//下一曲
				numPlayMusicNow = numPlayMusicNow + 1;
			}

			//当正在播放最后一首歌时
			else if(numPlayMusicNow == totalMusicCount - 1)
			{
				//跳到第一首歌
				numPlayMusicNow = 0;
			}
		}
	}

	//设置歌曲的序号
	ListBox_SetCurSel(hwndList,numPlayMusicNow);

	//得到歌曲的序号
	numPlayMusicNow = ListBox_GetCurSel(hwndList);

	//播放歌曲
	PlayMusic(hwnd);
}

在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

    //上一曲
		case IDC_PRESONG:
		{
			JumpMusic(hwnd,0);
		}
		break;

		//下一曲
		case IDC_NEXTSONG:
		{
			JumpMusic(hwnd,1);
		}
		break;



你可能感兴趣的:(自己动手开发音乐播放器《五》播放功能的实现)