/*请使用VC2005以上版本编译,VC6.0不能成功编译*/
#include <windows.h>
#include <tchar.h>
#include "Mmsystem.h"
#include "Digitalv.h"
#pragma comment(lib,"Winmm.lib")
///
#define ID_OPEN 101
#define ID_PLAY 102
#define ID_NEXT 103
#define ID_PREVIOUS 104
#define ID_PAUSE 105
#define ID_POS 106
#define ID_VOLUME 107
#define ID_LIST 110
#define ID_TIMER 111
///
HINSTANCE hInst;
HWND g_hList,g_hPause,g_hVolume,g_hPos;
int DeviceID;
UINT sel=0; //ListBox所选项目的索引值
DWORD_PTR length; //歌曲长度
///
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void addFile(HWND);
void autoPlay();
void playMusic(LPTSTR);
int mciOpen(LPTSTR);
void mciPlay(int);
void mciClose(int);
void mciPause(int);
void mciStop(int);
void mciResume(int);
void mciSetVolume(int,DWORD); //设置音量
DWORD_PTR mciLength(int); //获得歌曲长度
DWORD_PTR mciPosition(int); //判断歌曲当前播放位置
void mciSetPos(int,DWORD); //设置播放位置
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("Win32");
wcex.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
RegisterClassEx(&wcex);
hInst = hInstance;
HWND hWnd = CreateWindow(TEXT("Win32"), TEXT("音乐播放器"),WS_OVERLAPPED|WS_SYSMENU|
WS_MINIMIZEBOX , CW_USEDEFAULT, 0, 465,550, NULL, NULL, hInstance, NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool choose=true;
PAINTSTRUCT ps;
LPTSTR rec=(LPTSTR)malloc(MAX_PATH);;
switch (message) {
case WM_COMMAND:
switch(LOWORD(wParam)){
case ID_OPEN:
addFile(hWnd);
break;
case ID_PLAY:
sel=SendMessage(g_hList,LB_GETCURSEL,0,0);
SendMessage(g_hList,LB_GETTEXT,sel,(LPARAM)rec);
playMusic(rec);
KillTimer (hWnd,ID_TIMER);
SetTimer(hWnd,ID_TIMER,1000,NULL);
break;
case ID_NEXT:
++sel;
SendMessage(g_hList,LB_SETCURSEL,sel,0);
SendMessage(g_hList,LB_GETTEXT,sel,(LPARAM)rec);
playMusic(rec);
break;
case ID_PREVIOUS:
--sel;
SendMessage(g_hList,LB_SETCURSEL,sel,0);
SendMessage(g_hList,LB_GETTEXT,sel,(LPARAM)rec);
playMusic(rec);
break;
case ID_PAUSE:
if(choose){
mciPause(DeviceID);
SetWindowText(g_hPause,TEXT("继续"));
choose=false;
}
else{
mciResume(DeviceID);
SetWindowText(g_hPause,TEXT("暂停"));
choose=true;
}
break;
}
break;
case WM_PAINT:
BeginPaint (hWnd, &ps);
EndPaint (hWnd, &ps);
break;
case WM_HSCROLL:
switch(LOWORD(wParam)){
case SB_THUMBTRACK:
if(g_hVolume==(HWND)lParam){ //设置音量
SetScrollPos(g_hVolume ,SB_CTL,HIWORD(wParam),TRUE);
mciSetVolume(DeviceID,HIWORD(wParam));
}
else if(g_hPos==(HWND)lParam){ //控制播放位置
SetScrollPos(g_hPos ,SB_CTL,HIWORD(wParam),TRUE);
mciSetPos(DeviceID,HIWORD(wParam));
mciPlay(DeviceID);
}
}
break;
case WM_CLOSE:
KillTimer (hWnd,ID_TIMER);
mciClose(DeviceID);
DestroyWindow(hWnd);
break;
case WM_TIMER:
if(wParam==ID_TIMER){
SetScrollPos(g_hPos,SB_CTL,mciPosition(DeviceID),TRUE);
autoPlay();
}
break;
case WM_DESTROY:
KillTimer (hWnd,ID_TIMER);
mciClose(DeviceID);
PostQuitMessage(0);
break;
case WM_CREATE:
CreateWindow( TEXT("BUTTON"), TEXT("打开"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
0,480,60,25, hWnd, (HMENU)ID_OPEN,hInst,NULL);
CreateWindow( TEXT("BUTTON"), TEXT("播放"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
70,480,60,25, hWnd, (HMENU)ID_PLAY,hInst,NULL);
g_hPause=CreateWindow( TEXT("BUTTON"), TEXT("暂停"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
140,480,60,25, hWnd, (HMENU)ID_PAUSE,hInst,NULL);
CreateWindow( TEXT("BUTTON"), TEXT("下一曲"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
210,480,60,25, hWnd, (HMENU)ID_NEXT,hInst,NULL);
CreateWindow( TEXT("BUTTON"), TEXT("上一曲"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
280,480,60,25, hWnd, (HMENU)ID_PREVIOUS,hInst,NULL);
g_hList=CreateWindow( TEXT("LISTBOX"),NULL,WS_VISIBLE | WS_CHILD |
WS_BORDER|LBS_STANDARD , 0,0,450,450, hWnd, (HMENU)ID_LIST,
hInst,NULL);
g_hPos=CreateWindow( TEXT("SCROLLBAR"),NULL,
WS_VISIBLE | WS_CHILD | SBS_HORZ,
2,460,450,15, hWnd, (HMENU)ID_POS,hInst,NULL);
g_hVolume=CreateWindow( TEXT("SCROLLBAR"),NULL,
WS_VISIBLE | WS_CHILD | SBS_HORZ,
350,485,100,15, hWnd, (HMENU)ID_VOLUME,hInst,NULL);
SetScrollRange(g_hVolume,SB_CTL,0,1000,TRUE);
SetScrollPos(g_hVolume,SB_CTL,1000,TRUE);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
free(rec);
return 0;
}
void addFile(HWND hwnd)
{
LPTSTR lpszCurDir;
static TCHAR szFilter[]=TEXT("MP3 Files (*.mp3)\0*.mp3\0")\
TEXT("All Files (*.*)\0*.*\0\0");
static TCHAR szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
OPENFILENAME ofn;
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = hwnd ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = szFilter ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = szFileName ;
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrFileTitle = NULL ;
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = NULL ;
ofn.lpstrTitle = NULL ;
ofn.Flags = OFN_EXTENSIONDIFFERENT ;
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT (".mp3") ;
ofn.lCustData = 0 ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
ofn.hwndOwner = hwnd ;
ofn.lpstrFileTitle = szTitleName ;
ofn.Flags = 0 ;
GetOpenFileName(&ofn); //显示打开对话框
lpszCurDir=ofn.lpstrFile;
GetCurrentDirectory(MAX_PATH, lpszCurDir);
//将歌曲列表添加到ListBox中
DlgDirList(hwnd, lpszCurDir, ID_LIST,NULL, DDL_ARCHIVE);
}
void autoPlay()
{
if(mciPosition(DeviceID)>=length){
LPTSTR rec=(LPTSTR)malloc(MAX_PATH);;
++sel;
SendMessage(g_hList,LB_SETCURSEL,sel,0);//选中ListBox中第sel+1个项目
SendMessage(g_hList,LB_GETTEXT,sel,(LPARAM)rec);//获得ListBox中所选的项目
playMusic(rec);
free(rec);
}
}
void playMusic(LPTSTR rec)
{
DeviceID=mciOpen(rec);
length=mciLength(DeviceID);
SetScrollRange(g_hPos,SB_CTL,0,length,TRUE); //设置播放进度条的范围并置初始位置为0
SetScrollPos(g_hPos,SB_CTL,0,TRUE);
mciPlay(DeviceID);
}
int mciOpen(LPTSTR filename)
{
//关闭所有MCI
mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, MCI_WAIT, NULL);
MCI_OPEN_PARMS mciopen;
mciopen.lpstrElementName =filename;
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD_PTR)(&mciopen));
return mciopen.wDeviceID;
}
void mciPlay(int wDeviceID)
{
MCI_PLAY_PARMS mciplay;
mciplay.dwFrom =0;
mciplay.dwTo =-1;
mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD_PTR)(&mciplay));
}
void mciClose(int wDeviceID)
{
MCI_GENERIC_PARMS mciclose;
mciSendCommand(wDeviceID,MCI_CLOSE,MCI_NOTIFY,(DWORD_PTR)(&mciclose));
}
void mciPause(int wDeviceID)
{
MCI_GENERIC_PARMS mcipause;
mciSendCommand(wDeviceID,MCI_PAUSE,MCI_NOTIFY,(DWORD_PTR)(&mcipause));
}
void mciResume(int wDeviceID)
{
MCI_GENERIC_PARMS mciresume;
mciSendCommand(wDeviceID,MCI_RESUME,MCI_NOTIFY,(DWORD_PTR)(&mciresume));
}
void mciSetVolume(int wDeviceID, DWORD volume)
{
MCI_DGV_SETAUDIO_PARMS mcivolume;
mcivolume.dwItem=MCI_DGV_SETAUDIO_VOLUME;
mcivolume.dwValue=volume;
mciSendCommand(wDeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO_VALUE,(DWORD_PTR)(&mcivolume));
}
DWORD_PTR mciLength(int wDeviceID)
{
MCI_STATUS_PARMS statusParms;
mciSendCommand(wDeviceID,MCI_SEEK,MCI_SEEK_TO_END,NULL); //设置歌曲当前位置为歌曲结尾
statusParms.dwItem=MCI_STATUS_POSITION;
mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)&statusParms);
mciSendCommand(wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL); //设置歌曲当前位置为歌曲开始
return statusParms.dwReturn;;
}
DWORD_PTR mciPosition(int wDeviceID)
{
MCI_STATUS_PARMS statusParms;
statusParms.dwItem=MCI_STATUS_POSITION;
mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)&statusParms);
return statusParms.dwReturn;
}
void mciSetPos(int wDeviceID,DWORD Pos)
{
MCI_SEEK_PARMS mciseek;
mciseek.dwTo=Pos;
mciSendCommand(wDeviceID,MCI_SEEK,MCI_TO ,(DWORD_PTR)(&mciseek));
}