音量控制和播放进度也是音乐播放器中的基本的操作
首先定义一个函数用于控制音量
//控制音量
void Main_OnSlider(HWND hwnd,HWND hwndCtl,UINT code,int pos);
然后在BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)中添加下面的代码
HANDLE_MSG(hWnd, WM_HSCROLL,Main_OnSlider);//响应音量滑动条被拖动
最后在完善Main_OnSlider中的代码
//音量滑块被拖动
void Main_OnSlider(HWND hwnd,HWND hwndCtl,UINT code,int pos)
{
//判断是否拖动了音量滑块
switch(GetDlgCtrlID(hwndCtl))
{
//拖动音量滑块
case IDC_VOLUME_SLIDER:
{
//调节音量
SetVolume(hwnd);
}
break;
}
}
运行效果
播放进度的实现:
实现播放进度和音量控制类似,需要用到回调函数1秒钟调用一次
计算一首歌曲的总长度
定义一些全局变量用于实现歌曲的总播放时间
/****************************************************************************
计算歌曲的总播放时间所需的全局变量
*****************************************************************************/
static TCHAR musicTotalTime[256];//保存歌曲的总时间
static int TotalSecond;//保存歌曲的总时间(秒)
定义一个函数用于计算歌曲的总时长
/***************************************************************************
函数名: void MusicTotalTime(HWND hwnd)
函数功能: 计算一首歌曲的总时间
****************************************************************************/
void MusicTotalTime(HWND hwnd)
{
TCHAR musicTotalLength[256];//保存歌曲的总时长
TCHAR cmd[MAX_PATH];//保存播放命令
GetMusic(hwnd);//得到选中的歌曲
int Minute;//保存歌曲的时间(分钟)
//打印得到歌曲的总时长的命令
wsprintf(cmd,"status %s length",OpenMusicFile);
//发送得到歌曲的总时长的命令
mciSendString(cmd,musicTotalLength,sizeof(musicTotalLength)/sizeof(TCHAR),NULL);
//得到歌曲的总时长(秒)
TotalSecond = atoi(musicTotalLength)/1000;
//得到歌曲的时间长度(分)
Minute = TotalSecond / 60;
//得到歌曲的时长(秒)
int Second = TotalSecond - (Minute * 60);
//打印歌曲的时长
wsprintf(musicTotalTime,"%02d:%02d",Minute,Second);
//显示歌曲的时长
SetDlgItemText(hwnd,IDC_WHOLE_TIME,musicTotalTime);
}
在PlayMusic中定义一个定时器用于处理播放进度
SetTimer(hwnd,2,1000,SetProgressBar);//用于处理播放进度
完善SetProgressBar函数
/***************************************************************************j
函数名: SetProgressBar
函数功能: 播放歌曲时滑动条自动滑动
****************************************************************************/
void CALLBACK SetProgressBar(HWND hwnd, UINT message, UINT iTimerId,DWORD dwTime)
{
TCHAR nowMusicTime[256];//保存歌曲的播放位置
TCHAR totalLength[256];//保存歌曲的长度
TCHAR cmd[MAX_PATH];//保存播放命令
//打印得到歌曲的长度的命令
wsprintf(cmd,"status %s length",OpenMusicFile);
//发送得到歌曲的长度的命令
mciSendString(cmd,totalLength,sizeof(totalLength)/sizeof(TCHAR),NULL);
//得到歌曲的总时长
int totalSecond = atoi(totalLength) / 1000;
//设置播放进度条的最大值是歌曲的长度
SendDlgItemMessage(hwnd,IDC_MUSIC_SLIDER,TBM_SETRANGEMAX,false,(LPARAM)totalSecond);
//设置播放进度的最小值为0
SendDlgItemMessage(hwnd,IDC_MUSIC_SLIDER,TBM_SETRANGEMIN,false,(LPARAM)0);
//打印得到播放位置的命令
wsprintf(cmd,"status %s position",OpenMusicFile);
//发送得到播放位置的命令
mciSendString(cmd,nowMusicTime,sizeof(nowMusicTime)/sizeof(TCHAR),NULL);
int musicSliderTime = atoi(nowMusicTime) / 1000;
//设置播放进度
SendDlgItemMessage(hwnd,IDC_MUSIC_SLIDER,TBM_SETPOS, true,(LPARAM)musicSliderTime);
}
实现效果