自己动手开发音乐播放器《十一》下载音乐播放器

不知不觉中我的音乐播放器也做完了,在此我将代码分享给大家

主要的代码

#include "stdafx.h"
#include <windows.h>
#include <commdlg.h>//控制文件
#include <mmsystem.h>
#include <Shlobj.h>//处理文件夹
#include <windowsx.h>
#include <commctrl.h>/*使用滑块头文件*/
#include "resource.h"
#include "MainDlg.h"
#include "AboutDlg.h"
#include "ExitDlg.h"

#include "SkinH.h"//调用皮肤库
#pragma comment(lib,"SkinH.lib")

/************************************************************************
          处理音乐文件时所需的全局变量
*************************************************************************/
static OPENFILENAME ofn;//打开文件对话框的文件结构

static char szOpenFileName[80*MAX_PATH];//保存文件名

static char szFileName[80*MAX_PATH];//保存歌曲的全路径

static char szPath[80*MAX_PATH];//储存路径

static char OpenMusicFile[MAX_PATH];//保存路径(用于操作音乐)


/**********************************************************************
                 函数名:   FileInit(HWND hwnd)
                 函数功能: 打开文件初始化文件对话框
****************************************************************************/
void FileInit(HWND hwnd)
{
	//文件结构清零
	ZeroMemory(&ofn,sizeof(ofn));

	//文件结构的大小
	ofn.lStructSize = sizeof(ofn);

	//文件路径
	ofn.lpstrFile = szOpenFileName;

	ofn.lpstrFile[0] = TEXT('\0');

	ofn.nMaxFile = sizeof(szOpenFileName);

	//过滤器
	ofn.lpstrFilter = TEXT("所有支持文件(*.wav,*.mp3,*.wma)\0*.wav;*.mp3;*.wma\0wave文件(*.wav)\0*.wav\0mp3文件(*.mp3)\0*.mp3\0wma文件(*.wma)\0*.wma\0");
	
	ofn.nFilterIndex = 1;

	ofn.lpstrFileTitle = NULL;

	ofn.nMaxFileTitle = 0;

	ofn.lpstrInitialDir = NULL;

	ofn.hwndOwner = hwnd;

	ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT;
}


/**********************************************************************
              函数名:   bool OpenFileDlg(void)
              函数功能: 打开文件对话框
************************************************************************/
int OpenFileDlg(void)
{
	return GetOpenFileName(&ofn);
}


/**********************************************************************
           函数名:   void AddFile(HWND hwnd)
		   函数功能: 添加文件
***********************************************************************/
void AddFile(HWND hwnd)
{
	TCHAR *p;//用于遍历音乐文件

	int len = 0;

	FileInit(hwnd);//文件初始化
	
	if(OpenFileDlg())
	{
	/*把第一个文件名复制到szPath
		如果只选了一个文件,就复制到最后一个'\'
		如果选了多个文件,就复制到第一个NULL字符*/
		
		lstrcpyn(szPath, szOpenFileName, ofn.nFileOffset);
		/*当只选了一个文件时,下面的NULL是必须的
		这是不区别待选了一个和多个文件情况
		*/

		szPath[ofn.nFileOffset] = '\0';

		len = lstrlen(szPath);

		if(szPath[len - 1] != '\\')
		{
			lstrcat(szPath,TEXT("\\"));
		}

		p = szOpenFileName + ofn.nFileOffset;

		ZeroMemory(szFileName, sizeof(szFileName));

		HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);

		while(*p)
		{
			lstrcat(szFileName, szPath);/*给文件名加上路径*/

			lstrcat(szFileName, p);/*加上文件名*/

			ListBox_InsertString(hwndList, -1, p);

			lstrcat(szFileName, TEXT("\n"));/*换行*/

			p += lstrlen(p) + 1;/*移到下一个文件*/
		}
	}
}


/************************************************************************************
                 函数名:   AddFolder(HWND hwnd)
				 函数功能: 添加文件夹
****************************************************************************/
void AddFolder(HWND hwnd)
{

	 //保存文件夹的路径
	 TCHAR szFile[MAX_PATH];

	 TCHAR pBuffer_Directory[MAX_PATH];//存放文件信息

     BROWSEINFO sBrowseInfo;//文件夹结构
	 
	 LPCITEMIDLIST lpitem;//用于判断是否选择了一个文件夹
	 
	 WIN32_FIND_DATA sfd;//文件的全部属性结构

	 //对文件夹结构清零
	 ZeroMemory(&sBrowseInfo,sizeof(BROWSEINFO));

	 //浏览文件夹对话框的父窗体句柄。
	 sBrowseInfo.hwndOwner=hwnd;

	 //该浏览文件夹对话框对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。
	 sBrowseInfo.lpszTitle="请选择文件夹";

	 //文件夹对话框的选项
	 sBrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
     //BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK”按钮才可以使用。
	 
    //显示一个选择文件夹的对话框
	 lpitem=SHBrowseForFolder(&sBrowseInfo);

	 //判断是否选择了文件夹
	 if(NULL==lpitem)
	 {
		 return;
	 }
	 
	 //获得文件夹的路径
	 SHGetPathFromIDList(lpitem,pBuffer_Directory);
	 
	 strcpy(szFile,pBuffer_Directory);

	 //枚举过滤条件(只实现MP3)
    lstrcat(pBuffer_Directory,"\\*.mp3");	
	 
	 /*得到第一个文件(第一首歌)的句柄*/
	 HANDLE hfindfile = FindFirstFile(pBuffer_Directory,&sfd);
	 
	 if(INVALID_HANDLE_VALUE==hfindfile)//判断文件是否有效
	 {
		 return;
	 }
	 
	 do
	 {
		 if (sfd.cFileName[0]=='.')
		 {
			 continue;
		 }
		 
		 lstrcat(szFileName,szFile);

		 lstrcat(szFileName,TEXT("\\"));

		 lstrcat(szFileName,sfd.cFileName);

		 lstrcat(szFileName,TEXT("\n"));

		 //得到ListBox控件的句柄
		 HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

		 //将音乐文件的文件名(歌曲名)添加到播放列表中
		 ListBox_InsertString(hwndList,-1,sfd.cFileName);

	 }while (FindNextFile(hfindfile,&sfd));
	 /*只要没遍历到文件夹中的最后一个文件就一直添加*/
}


/***************************************************************************
               得到选定的歌曲所需的全局变量
*****************************************************************************/
TCHAR line[MAX_PATH];//保存歌曲的路径


/***************************************************************************
                  函数名:   void GetMusic(HWND hwnd)
				  函数功能:  得到选定的歌曲
*****************************************************************************/
void GetMusic(HWND hwnd)
{
	//得到ListBox控件的句柄
	HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

	//得到选择的歌曲的索引
	int CurSel = ListBox_GetCurSel(hwndList);

	//得到歌曲的全路径
	ListBox_GetText(hwndList,CurSel,line);

	//得到歌曲的短路径
	GetShortPathName(line,OpenMusicFile,sizeof(OpenMusicFile)/sizeof(TCHAR));
}


/****************************************************************************
                  计算歌曲的总播放时间所需的全局变量
*****************************************************************************/
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);
}


/***************************************************************************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);
}


/***********************************************************************************************
                     函数名:   void JumpProcess(HWND hwnd, int pos)
					 函数功能: 拖动滑动条,音乐从滑动条位置开始播放
************************************************************************************************/
void JumpProcess(HWND hwnd, int pos)
{
	TCHAR cmd[MAX_PATH + 20];

	wsprintf(cmd,"play %s from %d to %d", OpenMusicFile, pos,pos*100);

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


/***************************************************************************
            函数名:   void SetVolume(HWND hwnd)
			函数功能: 控制音量
****************************************************************************/
void SetVolume(HWND hwnd)
{
	//得到滑块中的音量值
	int voice = SendMessage(GetDlgItem(hwnd,IDC_VOLUME_SLIDER),TBM_GETPOS,0,0);

	//调节音量
	voice = voice * 10;

	TCHAR szVoice[256];//保存音量控制的命令

	//打印调节音量的命令
	wsprintf(szVoice,"setaudio %s volume to %d",OpenMusicFile,voice);

	//发送调节音量的命令
	mciSendString(szVoice,(LPTSTR)NULL,0,0);
}


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


/****************************************************************************
                 函数名:   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);

	//得到歌曲的总时长
	 MusicTotalTime(hwnd);

	//设置定时器
	SetTimer(hwnd,1,1000,MusicNowTime);//用于处理播放时间
	SetTimer(hwnd,2,1000,SetProgressBar);//用于处理播放进度

}


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


/**********************************************************************************************
                 函数名:   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 StopMusic(HWND hwnd)
		   函数功能:停止播放
************************************************************************************************/
void StopMusic(HWND hwnd)
{
	TCHAR cmd[256];

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

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


/****************************************************************************************************************
                 实现上一曲和下一曲所需的全局变量
*****************************************************************************************************************/
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 PlayTypeMenuSet(HWND hwnd,int indexs)
				   函数功能: 播放模式菜单设定
*******************************************************************************/
void PlayTypeMenuSet(HWND hwnd,int indexs)
{
	//该函数取得分配给指定窗口的菜单的句柄
	HMENU hMenu = GetMenu(hwnd);

	switch(indexs)
	{
	    case 0://列表循环
		{
			CheckMenuItem(hMenu,ID_MENUORDER,MF_CHECKED);
		    CheckMenuItem(hMenu,ID_MENUCIRCULATION,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENURANDOM,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENUITEM40017,MF_UNCHECKED);
		}
		break;

		case 1://顺序播放
		{
			CheckMenuItem(hMenu,ID_MENUORDER,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENUCIRCULATION,MF_CHECKED);
		    CheckMenuItem(hMenu,ID_MENURANDOM,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENUITEM40017,MF_UNCHECKED);
		}
		break;

		case 2://单曲循环
		{
			CheckMenuItem(hMenu,ID_MENUORDER,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENUCIRCULATION,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENURANDOM,MF_CHECKED);
		    CheckMenuItem(hMenu,ID_MENUITEM40017,MF_UNCHECKED);
		}
		break;

		case 3://随机播放
		{
			CheckMenuItem(hMenu,ID_MENUORDER,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENUCIRCULATION,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENURANDOM,MF_UNCHECKED);
		    CheckMenuItem(hMenu,ID_MENUITEM40017,MF_CHECKED);
		}
		break;
		default:
		break;
	}
}


/***************************************************************************
                 显示播放歌曲的时间所需的全局变量     
****************************************************************************/
static char curTime[256];//当前歌曲播放的位置

/***************************************************************************
               函数名:   MusicNowTime
			   函数功能: 显示当前歌曲的播放时间
*****************************************************************************/
void CALLBACK MusicNowTime(HWND hwnd,UINT message,UINT iTimerId,DWORD dwTime)
{
	TCHAR Position[256];//保存歌曲的播放位置
	TCHAR cmd[256];//保存得到歌曲的播放位置的命令

	//打印得到歌曲的播放位置的命令
	wsprintf(cmd,"status %s position",OpenMusicFile);

	//发送得到歌曲播放时间的命令
	mciSendString(cmd, Position, sizeof(Position)/sizeof(TCHAR), NULL);

	int Time = atoi(Position)/1000;//保存歌曲的播放时间(秒)

	int Minute = Time/60;//分钟

	int Second = Time - 60*Minute;//秒

	//打印播放时间
	wsprintf(curTime,"%02d:%02d",Minute,Second);

	//显示播放时间
	SetDlgItemText(hwnd,IDC_BEGIN_TIME,curTime);

	TCHAR mode[MAX_PATH];//保存的到当前的播放状态

	//打印得到状态的命令
	wsprintf(cmd,"status %s mode",OpenMusicFile);

	//发送得到状态的命令
	mciSendString(cmd,mode,sizeof(mode)/sizeof(TCHAR),NULL);

	//判断一首歌是否播完
	if(0 == strcmp(mode,TEXT("stopped")))
	{
		switch(iLoopType)
		{
		
           	case 0://列表循环
			{
				//下一曲
				JumpMusic(hwnd, 1);
			}
			break;
			
			case 1://顺序播放
			{
				if(numPlayMusicNow == totalMusicCount-1)
				{
					//停止
					StopMusic(hwnd);
				}
				else
				{
					//下一曲
					JumpMusic(hwnd, 1);
				}
			}
			break;

			case 2://单曲循环
			{
				PlayMusic(hwnd);
			}
			break;


			case 3://随机播放
			{
				//下一曲
				JumpMusic(hwnd, 1);
			}
			break;
			default:
			break;
		}
	}
}


/*************************************************************************
                函数名:   void DeleteMusic(HWND hwnd)
				函数功能: 删除选定的歌曲
**************************************************************************/
void DeleteMusic(HWND hwnd)
{
	GetMusic(hwnd);//选定歌曲

	//得到ListBox控件的句柄
	HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

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

	//下一曲
	JumpMusic(hwnd,1);

	//删除选定的歌曲
	ListBox_DeleteString(hwndList,CurSel);
}


/**************************************************************************
                 函数名:   void DeleteList(HWND hwnd)
				 函数功能: 清空播放列表
**************************************************************************/
void DeleteList(HWND hwnd)
{
	HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

	//得到播放列表中歌曲的数量
	int Count = ListBox_GetCount(hwndList);

	for(int i=Count-1;i>=0;i--)
	{
		ListBox_DeleteString(hwndList,i);
	}

	//停止播放
	StopMusic(hwnd);

    //歌曲显示为空
	SetDlgItemText(hwnd,IDC_PLAYEDIT,NULL);

	//关闭定时器
	KillTimer(hwnd,1);

	//关闭定时器
	KillTimer(hwnd,2);

	//清空播放时间
	SetDlgItemText(hwnd,IDC_BEGIN_TIME,NULL);

	//清空总时间
	SetDlgItemText(hwnd,IDC_WHOLE_TIME,NULL);

	//播放进度条返回起始位置
	SendDlgItemMessage(hwnd,IDC_MUSIC_SLIDER,TBM_SETPOS,true,(LPARAM)NULL);
}


/**************************************************************************
   设定迷你模式所需的全局变量
**************************************************************************/
static int flag = 0;//标记音乐播放器为迷你模式


/**************************************************************************
            函数名:   void SetMiniMode(HWND hwnd)
			函数功能: 设置迷你模式
**************************************************************************/
void SetMiniMode(HWND hwnd)
{
	//得到菜单句柄
	HMENU hMenu = GetMenu(hwnd); 

	if(0 == flag)
	{
		//选中迷你模式
		CheckMenuItem(hMenu,ID_MENUMINIMODE,MF_CHECKED);

		//将窗口变成迷你模式窗口
		SetWindowPos(hwnd,0,122,75,385,445,SWP_NOMOVE | SWP_NOZORDER);

		flag = 1;//标识符,标示窗口为普通窗口
	}
	else
	{
		//不选择迷你模式
		CheckMenuItem(hMenu,ID_MENUMINIMODE,MF_UNCHECKED);

		//将窗口还原成普通窗口
		SetWindowPos(hwnd,0,122,75,615,495,SWP_NOMOVE | SWP_NOZORDER);

		flag = 0;//标示窗口为迷你窗口
	}
}


BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
     //	HANDLE_MSG(hWnd, WM_HSCROLL, Main_OnHScroll);//响应音乐滑动条被拖动
	  	HANDLE_MSG(hWnd, WM_HSCROLL,Main_OnSlider);//响应音量滑动条被拖动 
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
		HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);

		//托盘消息
	     case WM_SHOWTASK:
		{
			//在托盘上单击左键
			if(WM_LBUTTONDOWN == lParam)
			{
				//还原音乐播放器
				ToTray(hWnd,2);
			}

			//在托盘上单击右键
			if(WM_RBUTTONDOWN == lParam)
			{
				//退出音乐播放器
				exit(0);
			}
		}
		break;
    }

    return FALSE;
}


//音量滑块被拖动
void Main_OnSlider(HWND hwnd,HWND hwndCtl,UINT code,int pos)
{
	//判断是否拖动了音量滑块
	switch(GetDlgCtrlID(hwndCtl))
	{
		//拖动音量滑块
		case IDC_VOLUME_SLIDER:
		{
			//调节音量
			SetVolume(hwnd);
		}
		break;
	}
}


/************************************************************************************************
          定义修改窗口的透明度所需的变量
*************************************************************************************************/
#define		WS_EX_LAYERED					0x00080000 
#define		LWA_COLORKEY					0x00000001 
#define		LWA_ALPHA						0x00000002 

typedef	BOOL (FAR	WINAPI	*LAYERFUNC)(HWND,COLORREF,BYTE,DWORD); 

int Item = 0;


/************************************************************************************************
                 函数名:SetLayeredWindowAttributes
				 函数功能:设置窗口的透明度
************************************************************************************************/
BOOL SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags) 
{ 
	LAYERFUNC SetLayer; 
	BOOL bReturn;
	HMODULE	hmod = LoadLibrary("user32.dll"); 
	SetLayer = (LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes"); 
	bReturn = SetLayer(hwnd,crKey,bAlpha,dwFlags); 
	FreeLibrary(hmod); 
	return bReturn; 
}


/*******************************************************************************************
                              函数名称: ChangeTransparency 
                              函数功能:	改变窗口的透明度
*********************************************************************************************/
void ChangeTransparency(HWND hwnd, int indexs)
{
	//得到菜单句柄
	HMENU hMenu = GetMenu(hwnd);

	switch (indexs)
	{
		case 0: //窗口的透明度为10%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);

			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为10%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),25,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为10%
				CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),25,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 1://窗口的透明度为30%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);

			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为30%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),50,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为10%
				CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),50,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 2: //设定窗口的透明度为50%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);
			
			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为50%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),125,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为50%
				CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),125,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 3://设定窗口的透明度为70%
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);
			
			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为70%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),175,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为10%
				CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),175,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 4://设定窗口的透明度为90% 
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_CHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_UNCHECKED);
			
			if(0 == Item)//保证窗口能自由的切换透明度
			{
				//设置窗口的透明度为90%
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),225,LWA_ALPHA);

				Item = 1;//使得窗口有向非透明转换的趋势
			}
			else
			{
				//不选中透明度为90%
				CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
	            CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
				
				//设定窗口为不透明
				SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			    SetLayeredWindowAttributes(hwnd,RGB(100,100,100),225,LWA_ALPHA);

				Item = 0;//使得窗口有向透明度为10%转换的趋势
			}
		}
		break;

		case 5: //设定窗口为不透明
		{
			CheckMenuItem(hMenu,ID_MENUTM10,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM30,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM50,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM70,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUTM90,MF_UNCHECKED);
			CheckMenuItem(hMenu,ID_MENUUNTM,MF_CHECKED);
			
			//设置窗口的透明度为不透明
			SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
			SetLayeredWindowAttributes(hwnd,RGB(100,100,100),255,LWA_ALPHA);	
		}
		break;
		default:
		break;
	}
}

//程序初始化
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
	//设置最大的音量是1000
	SendDlgItemMessage(hwnd,IDC_VOLUME_SLIDER,TBM_SETRANGEMAX,false,(LPARAM)1000);

	//音量滑块滑动到最大的音量处
	SendDlgItemMessage(hwnd,IDC_VOLUME_SLIDER,TBM_SETPOS, true,(LPARAM)1000);

	/*在窗口的标题栏上显示图标*/
	SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)));

	/*在托盘上显示一个图标*/
	ToTray(hwnd,4);

	SkinH_Attach();//加载皮肤,你就可以看到界面皮肤变了

	return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
		/*添加歌曲到列表中*/
        case ID_MENUADD:
		{
			AddFile(hwnd);
		}
        break;

		/*添加歌曲到播放列表中*/
		case IDC_ADD:
		{
			AddFile(hwnd);
		}
		break;

		//删除歌曲
		case IDC_DELETE:
		{
			DeleteMusic(hwnd);
		}
		break;

		//清空播放列表
		case IDC_DELETE_LIST:
		{
			DeleteList(hwnd);
		}
		break;

		//添加文件夹中的所有歌曲到播放列表
		case ID_MENUADDFOLDER:
		{
			AddFolder(hwnd);
		}
		break;

		//播放歌曲
		case IDC_PLAY:
		{
			PlayMusic(hwnd);
		}
		break;
		
		//双击播放列表
		case IDC_LIST1:
		{
			if(LBN_DBLCLK == codeNotify)
			{
				PlayMusic(hwnd);//播放歌曲
			}
		}
		break;

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

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

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

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

		case ID_MENUORDER://列表循环
		{
			PlayTypeMenuSet(hwnd,0);
			iLoopType = 0;
		}
		break;
		
		case ID_MENUCIRCULATION://顺序播放
		{
			PlayTypeMenuSet(hwnd,1);
			iLoopType = 1;
		}
		break;
		
		case ID_MENURANDOM://单曲循环
		{
			PlayTypeMenuSet(hwnd,2);
			iLoopType = 2;
		}
		break;

		case ID_MENUITEM40017://随机播放
		{
			PlayTypeMenuSet(hwnd,3);
		    iLoopType = 3;
		}
		break;

	    case ID_MENUTM10://设定窗口透明度为10%
		{
			ChangeTransparency(hwnd, 0);
		}
		break;

		case ID_MENUTM30://设定窗口透明度为30%
		{
			ChangeTransparency(hwnd, 1);
		}
		break;
		
		case ID_MENUTM50://设定窗口透明度为50%
		{
			ChangeTransparency(hwnd, 2);
		}
		break;
		
		case ID_MENUTM70://设定窗口透明度为70%
		{
			ChangeTransparency(hwnd, 3);
		}
		break;
		
		case ID_MENUTM90://设定窗口透明度为90%
		{
			ChangeTransparency(hwnd, 4);
		}
		break;
		
		case ID_MENUUNTM://设定窗口为不透明
		{
			ChangeTransparency(hwnd, 5);
		}
		break;

		//迷你模式
		case ID_MENUMINIMODE:
		{
			SetMiniMode(hwnd);
		}
		break;

		//关于
		case ID_MENUITEM40016:
		{
			/*得到窗口的实例句柄*/
	        HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);

	       /*弹出对话框*/
	       DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_ABOUT), NULL,About_Main_Proc, NULL);
		}
		break;

		//退出音乐播放器
        case ID_MENUITEMEXIT:
		{
			Exit_Main_OnClose1(hwnd);
		}
		break;
        default:
		break;
    }
}

void Main_OnClose(HWND hwnd)
{
	/*得到窗口的实例句柄*/
	HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);

	/*弹出对话框*/
	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_EXIT), NULL,Exit_Main_Proc, NULL);
}



单击此处下载音乐播放器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值