不知不觉中我的音乐播放器也做完了,在此我将代码分享给大家
主要的代码
#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);
}