基於MCI的音樂播放器

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章