www.pudn.com > SimplePlayer.rar > SimplyPlayerDlg.cpp


// SimplyPlayerDlg.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "SimplyPlayer.h" 
#include "SimplyPlayerDlg.h" 
#include "BrowseDirDialog.h" 
 
///////////////////// 
#include "AboutMe.h" 
#include "Mp3Tags.h" 
 
//////////////////// 
//加载WINDOWS视频的头文件 
#include "vfw.h" 
#include ".\simplyplayerdlg.h" 
 
 
//自定义消息,用来获取程序图标在托盘里操作时得到的消息通知 
#define WM_SHOWTASK WM_USER+1 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
 
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 
/* 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// 对话框数据 
	enum { IDD = IDD_ABOUTBOX }; 
 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持 
 
// 实现 
protected: 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
END_MESSAGE_MAP() 
*/ 
 
 
// CSimplyPlayerDlg 对话框 
 
 
 
CSimplyPlayerDlg::CSimplyPlayerDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CSimplyPlayerDlg::IDD, pParent) 
{ 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
 
	m_Audio = NULL; 
	//构造全局的存储歌曲路径的链表 
	head = new FilePath(); 
	head->nItem = 0; 
	head->m_Path = _T(""); 
	head->next = NULL; 
	pEnd= head; 
 
	//初始化列表框中没有歌曲,num表示当前列表中最后一项 
	num = 0; 
	index = 0; 
	//创建背景画刷 
	m_brush.CreateSolidBrush( RGB(192, 192 ,192) );	 
} 
 
CSimplyPlayerDlg::~CSimplyPlayerDlg() 
{ 
	delete head; 
} 
 
void CSimplyPlayerDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	DDX_Control(pDX, IDC_OPEN, m_Open); 
	DDX_Control(pDX, IDC_PAUSE, m_Pause); 
	DDX_Control(pDX, IDC_STOP, m_Stop); 
	DDX_Control(pDX, IDC_STATUS, m_Status); 
	DDX_Control(pDX, IDC_FILENAME, m_FileName); 
	DDX_Control(pDX, IDC_VOLUME, m_Volume); 
	DDX_Control(pDX, IDC_MUSICLIST, m_AddList); 
	DDX_Control(pDX, IDC_RANDOM, m_Random); 
	DDX_Control(pDX, IDC_VOLUMECTRL, m_VolumeControl); 
	DDX_Control(pDX, IDC_FRONT, m_Front); 
	DDX_Control(pDX, IDC_NEXT, m_Next); 
 
	DDX_Control(pDX, IDC_ADDFILE, m_AddBtn); 
	DDX_Control(pDX, IDC_DELETELIST, m_ClearBtn); 
} 
 
BEGIN_MESSAGE_MAP(CSimplyPlayerDlg, CDialog) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_WM_TIMER() 
	ON_WM_CLOSE() 
	ON_WM_CTLCOLOR() 
	//}}AFX_MSG_MAP 
	//自定义的对四个简单按钮的事件处理 
	ON_BN_CLICKED(IDC_OPEN, OnOpen) 
	ON_BN_CLICKED(IDC_PAUSE, OnPause) 
	ON_BN_CLICKED(IDC_STOP, OnStop)	 
	ON_BN_CLICKED(IDOK, OnDlgExit) 
 
	//对滑块的消息处理 
	ON_WM_HSCROLL() 
 
	//对最小化按钮的响应 
	ON_MESSAGE(WM_SHOWTASK, OnShowTask) 
	ON_COMMAND(IDC_POPMENU_ABOUT, OnPopmenuAbout) 
	ON_COMMAND(IDC_POPMENU_EXIT, OnPopmenuExit) 
	 
	//对“添加”按钮的消息响应 
	ON_BN_CLICKED(IDC_ADDFILE, OnAddMusic) 
	//对列表框控件的处理 
	ON_NOTIFY(NM_DBLCLK, IDC_MUSICLIST, OnDbClkMusicList) 
	ON_BN_CLICKED(IDC_DELETELIST, OnDeletelist) 
	 
	ON_BN_CLICKED(IDC_RANDOM, OnRandom) 
	ON_BN_CLICKED(IDC_FRONT, OnFrontMusic) 
	ON_BN_CLICKED(IDC_NEXT, OnNextMusic) 
 
END_MESSAGE_MAP() 
 
 
// CSimplyPlayerDlg 消息处理程序 
 
BOOL CSimplyPlayerDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// 将\“关于...\”菜单项添加到系统菜单中。 
 
	// IDM_ABOUTBOX 必须在系统命令范围内。 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 
	//  执行此操作 
	SetIcon(m_hIcon, TRUE);			// 设置大图标 
	SetIcon(m_hIcon, FALSE);		// 设置小图标 
 
	//ShowWindow(SW_MINIMIZE); 
 
	// TODO: 在此添加额外的初始化代码 
	//初始化让暂停与停止按钮无效 
	m_Pause.EnableWindow(FALSE); 
	m_Stop.EnableWindow(FALSE); 
	m_Random.EnableWindow(FALSE); 
	m_Front.EnableWindow(FALSE); 
	m_Next.EnableWindow(FALSE); 
	//设置标志 
	bPause = TRUE; 
	bRand = FALSE; 
 
 
	//设置滑块的范围与初值 
	m_Volume.SetRange(0, 1000); 
	m_Volume.SetPos(500); 
	OldPos = m_Volume.GetPos(); 
 
	//自定义窗口显式样式 
	//ShowWindow(SW_SHOWNORMAL); 
	//MoveWindow(400,400,400,320);  
	//设置程序始终在最顶端窗口 
	//SetWindowPos(&CWnd::wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); 
	 
	InitMusicList(); 
 
	//*****************由于直接在OnCtrlColor中设置static控件的背景与颜色,所以不用 子类化  的方法来实现*************//////// 
 
	/*m_Status.SetBackColor(  RGB(192, 192 ,192) ); 
	m_Status.SetTextColor(  RGB(255,0 ,0) ); 
	//m_Status.SetCaption( _T("播放中:")); 
 
	m_FileName.SetBackColor(  RGB(192, 192 ,192) ); 
	m_FileName.SetTextColor(  RGB( 255, 0 ,0) ); 
	//m_FileName.SetCaption( _T("播放中:")); 
 
	m_VolumeControl.SetBackColor( RGB(192, 192 ,192) ); 
	m_VolumeControl.SetTextColor( RGB(72, 72 ,72) ); 
	m_VolumeControl.SetCaption( _T("音量控制:"));*/ 
 
	 
	//初始化托盘的属性 
	nid.cbSize = (DWORD) sizeof(NOTIFYICONDATA); 
	nid.hWnd = m_hWnd; 
	nid.hIcon = m_hIcon; 
	nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
	nid.uID = IDR_MAINFRAME; 
	nid.uCallbackMessage = WM_SHOWTASK; 
	strcpy(nid.szTip, _T("MyPlayer → By Stefanie924")); 
	 
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE 
} 
 
void CSimplyPlayerDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		//CAboutDlg dlgAbout; 
		//dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
		 
 
	//响应最小化按钮与关闭按钮时,把他放入托盘中 
	if( SC_MINIMIZE == nID  || SC_CLOSE == nID ) 
	{ 
		ToTray(TRUE);	 
	} 
 
	CDialog::OnSysCommand(nID, lParam); 
} 
 
// 如果向对话框添加最小化按钮,则需要下面的代码 
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, 
//  这将由框架自动完成。 
 
void CSimplyPlayerDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // 用于绘制的设备上下文 
 
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); 
 
		// 使图标在工作矩形中居中 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// 绘制图标 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
//当用户拖动最小化窗口时系统调用此函数取得光标显示。 
HCURSOR CSimplyPlayerDlg::OnQueryDragIcon() 
{ 
	return static_cast(m_hIcon); 
} 
 
//打开文件并播放 
void CSimplyPlayerDlg::OnOpen() 
{ 
	CString m_Path,  strIndex, strTruthMusicTime; 
	strIndex.Format("%d:", num+1); 
	// 过滤文件类型 
	_TCHAR strFileFilter[] = "MP3 File(*.mp3)|*.mp3|" 
							 "WMA File(*.wma)|*.wma||"; 
	//创建打开对话框选择歌曲 
	CFileDialog Mp3Dlg(TRUE,NULL ,NULL, OFN_HIDEREADONLY,strFileFilter); 
	 
	if(Mp3Dlg.DoModal() == IDOK) 
	{ 
		//获得文件路径名与文件名并更新 
		m_Path =  Mp3Dlg.GetPathName(); 
		//播放 
		OnPlay(m_Path, strIndex); 
		OutputItem(m_Path); 
 
		//打开歌曲时,总是把它放到最后,所以他的索引就是num 
		index = num - 1; 
		m_AddList.SetSelectionMark( index ); 
	}		 
} 
 
//处理暂停按键 
void CSimplyPlayerDlg::OnPause() 
{ 
	// 正在暂停中 
	if( bPause == TRUE  ) 
	{ 
		MCIWndPause(m_Audio); 
		status = _T("暂停中"); 
		SetDlgItemText( IDC_PLAY, _T("暂停")); 
		//m_Status.SetCaption( status ); 
		m_Status.SetWindowText( status ); 
		bPause = FALSE; 
	} 
	//暂停时 
	else 
	{ 
		if(bRand == FALSE) 
		{ 
			MCIWndResume(m_Audio); 
			status = _T("顺序播放中"); 
			SetDlgItemText( IDC_PLAY, _T("播放")); 
			m_Status.SetWindowText( status ); 
			bPause = TRUE; 
		} 
		if(bRand == TRUE) 
		{ 
			MCIWndResume(m_Audio); 
			status = _T("随机播放中"); 
			SetDlgItemText( IDC_PLAY, _T("播放")); 
			m_Status.SetWindowText( status ); 
			bPause = TRUE; 
		} 
	} 
} 
 
//处理停止按键 
void CSimplyPlayerDlg::OnStop() 
{ 
	// 销毁m_Audio句柄 
	MCIWndDestroy(m_Audio); 
	m_Audio = NULL; 
	//设置状态 
	m_Status.SetWindowText( _T("") ); 
	m_FileName.SetWindowText( _T("已停止,请重新打开或添加歌曲到列表中!") ); 
	//禁用 暂停 按钮 
	m_Pause.EnableWindow(FALSE); 
	m_Random.EnableWindow(FALSE); 
	m_Front.EnableWindow(FALSE); 
	m_Next.EnableWindow(FALSE); 
}  
 
//用来播放 
void CSimplyPlayerDlg::OnPlay(CString m_Path,  CString strIndex) 
{ 
	CString strMusicName; 
	CString strTruthMusicTime, strTimeFormat; 
	strMusicName = GetMusicInfo(m_Path, strIndex); 
 
	//结束当前歌曲(销毁当前句柄) 
	MCIWndDestroy(m_Audio); 
	m_Audio = NULL; 
 
	if(m_Audio == NULL) 
	{ 
		//创建句柄,打开MCI设备或文件 
		m_Audio = MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(), WS_CHILD | WS_VISIBLE | MCIWNDF_NOMENU, m_Path); 
	} 
	else 
	{ 
		MCIWndHome(m_Audio); 
	} 
	MCIWndPlay(m_Audio); 
	//禁用 暂停 停止 按钮 
	m_Pause.EnableWindow(TRUE); 
	m_Stop.EnableWindow(TRUE); 
	m_Random.EnableWindow(TRUE); 
	m_Front.EnableWindow(TRUE); 
	m_Next.EnableWindow(TRUE); 
	 
	//在播放器打开时,置播放状态 
	if(bRand == FALSE) 
	{ 
		status = _T("顺序播放中"); 
		 
	} 
	else 
	{ 
		status = _T("随机播放中"); 
		 
	} 
	 
	m_FileName.SetWindowText( strMusicName ); 
	m_Status.SetWindowText( status ); 
 
	//strTruthMusicTime = GetTruthMusicTime(m_Path); 
	//m_AddList.SetItemText(index, 2, strTruthMusicTime); 
	 
	//设置定时器,检测歌曲进度  
	SetTimer(0,1000,NULL); 
} 
 
//检测歌曲是否唱完  
void  CSimplyPlayerDlg::OnTimer(UINT nIDEvent) 
{ 
	if(0 == nIDEvent) 
	{ 
		CString m_Path, MusicName, strIndex, strTime; 
		if(m_Audio != NULL) 
		{ 
			//当前歌曲唱完时 
			if( MCIWndGetPosition(m_Audio) == MCIWndGetLength(m_Audio) ) 
			{ 
				//判断随机的标志来进行播放 
				if(bRand == TRUE) 
				{ 
					OnRandomPlay(); 
				} 
				else 
				{ 
					OnOrderPlay(); 
				} 
			}		 
		} 
	} 
 
	CDialog::OnTimer(nIDEvent); 
} 
 
///自定义用来处理滑块的消息 
 
//向右滑 
void CSimplyPlayerDlg::OnNext() 
{ 
	int CurrentPos = OldPos + 50; 
	m_Volume.SetPos( CurrentPos ); 
	MCIWndSetVolume(m_Audio, CurrentPos ); 
	OldPos = CurrentPos; 
} 
 
//向左滑 
void CSimplyPlayerDlg::OnPrior() 
{ 
	int CurrentPos = OldPos - 50; 
	m_Volume.SetPos( CurrentPos  ); 
	MCIWndSetVolume(m_Audio, CurrentPos ); 
	OldPos = CurrentPos; 
} 
 
//拖动滑块 
void CSimplyPlayerDlg::OnThumbTrack() 
{ 
	int CurrentPos  = m_Volume.GetPos(); 
	m_Volume.SetPos( CurrentPos ); 
	MCIWndSetVolume(m_Audio, CurrentPos ); 
	OldPos = CurrentPos; 
} 
 
//处理滑块上的事件 
void CSimplyPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
 
	//处理具体的事件 
	switch( nSBCode ) 
	{ 
		case TB_PAGEDOWN:    OnNext( ); 
			break; 
		case TB_PAGEUP:      OnPrior( ); 
			break; 
		case TB_THUMBTRACK:  OnThumbTrack( ); 
			break;			 
		default: 
			break; 
	} 
 
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
 
//把程序放到托盘中 
void CSimplyPlayerDlg::ToTray(BOOL Show) 
{ 
	if(Show) 
	{ 
		UpdateData(TRUE); 
		Shell_NotifyIcon(NIM_ADD,&nid);   //放入托盘中 
		ShowWindow(FALSE);                //隐藏主窗口 
	} 
	else 
	{ 
		Shell_NotifyIcon(NIM_DELETE,&nid);//从托盘中删除 
	} 
} 
 
//处理托盘的回调函数(也就是对托盘的一些消息响应如单击,右击,双击) 
LRESULT CSimplyPlayerDlg::OnShowTask(WPARAM wParam, LPARAM lParam) 
{ 
	if(m_AddList.GetItemCount() > 0) 
	{ 
		CString m_Path, strFileName, strIndex, strMusicInfo; 
		FilePath *cur = FindItem(head, index); 
		m_Path = cur->m_Path; 
		strFileName = PathNameConvertFileName(m_Path);		 
		if(strFileName != _T("")) 
		{ 
			strIndex.Format("%d → ", index+1);	 
			strMusicInfo = strIndex + strFileName; 
			strcpy( nid.szTip, strMusicInfo); 
			Shell_NotifyIcon(NIM_MODIFY, &nid); 
		} 
		else 
		{ 
			strcpy( nid.szTip, _T("永远的Stefanie")); 
			Shell_NotifyIcon(NIM_MODIFY, &nid); 
		} 
	} 
	 
	if(WM_LBUTTONDOWN == lParam ) 
	{ 
		//显示并放在最顶端 
		ShowWindow(TRUE);   
		SetForegroundWindow(); 
	} 
	if(WM_RBUTTONDOWN == lParam) 
	{ 
		//创建右键弹出菜单 
		CMenu popmenu; 
		popmenu.LoadMenu(IDR_POPMENU); 
		//获取鼠标当前位置 
		CPoint pos; 
		GetCursorPos( &pos ); 
		CMenu* pSubMenu = (CMenu*)popmenu.GetSubMenu(0);  
		//因为此时在托盘里,应用程序处于后台,而菜单只有在应用程序从前台到后台才会自己消失, 
		//如果你的程序一直在后台,应用程序没办法给菜单消息让他消失。  
		//所以把程序调到前台就可以了! 
		SetForegroundWindow(); 
		//显示弹出菜单  
		pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x,pos.y, this); 
	} 
	/*if(WM_LBUTTONDBLCLK == lParam) 
	{ 
		MessageBox(_T("单击就返回主界面,不用双击!"),_T("温馨提示→Stefanie924")); 
	}*/ 
	 
	 
	return 0; 
} 
 
void CSimplyPlayerDlg::OnPopmenuAbout() 
{ 
	CAboutMe dlg; 
	dlg.DoModal(); 
} 
 
void CSimplyPlayerDlg::OnPopmenuExit() 
{ 
	//发出程序退出消息 
	PostMessage(WM_QUIT); 
	//删除在托盘下的图标 
	ToTray(FALSE); 
} 
 
//重写对关闭按钮的响应 
void CSimplyPlayerDlg::OnClose() 
{ 
	//发出程序退出消息 
	PostMessage(WM_QUIT); 
	//删除在托盘下的图标 
	ToTray(FALSE); 
} 
 
void CSimplyPlayerDlg::OnAddMusic() 
{ 
	POSITION pos; 
	CString strNumber, MusicName, m_Path; 
	_TCHAR  lpFilter[] = "MP3 File(*.mp3)|*.mp3|" 
						 "WMA File(*.wma)|*.wma||"; 
	CFileDialog FileDlg(TRUE,0, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT , lpFilter ); 
 
	if( FileDlg.DoModal()  == IDOK ) 
	{ 
		//插入一个或多个文件,获取第一首歌的位置 
		pos = FileDlg.GetStartPosition(); 
 
		while(pos != NULL) 
		{ 
			//获取选中多个文件时下一个文件的完整路径名,并指向下一个pos,所以能够读取所有选中的文件 
			m_Path = FileDlg.GetNextPathName( pos ); 
			//创建新结点,保存列表框的item与路径信息 
			OutputItem(m_Path); 
		}	 
	} 
 
	//目录对话框方式添加整个文件夹(水平有限,有待完善ing) 
	/*CBrowseDirDialog dlg; 
	dlg.DoBrowse(); 
	MessageBox( dlg.m_Path );*/ 
} 
 
//初始化列表框控件 
void CSimplyPlayerDlg::InitMusicList() 
{	 
	m_AddList.SetExtendedStyle( LVS_EX_FULLROWSELECT  | LVS_NOSCROLL/*| LVS_EX_GRIDLINES*/ ); 
 
	m_AddList.InsertColumn(0,"ID",LVCFMT_LEFT, 30); 
	m_AddList.InsertColumn(1, "歌曲信息",LVCFMT_LEFT, 190); 
	m_AddList.InsertColumn(2, "歌曲长度",LVCFMT_LEFT, 68); 
 
	/*m_AddList.SetBkColor(  RGB(224, 224 ,224) ); 
	m_AddList.SetTextBkColor( RGB(224, 224 ,224) ); 
	m_AddList.SetTextColor( RGB(85, 116, 87) );*/ 
	m_AddList.SetBkColor(  RGB(0, 0 ,0) ); 
	m_AddList.SetTextBkColor( RGB(0, 0 ,0) ); 
	m_AddList.SetTextColor( RGB(105, 210, 0) ); 
	 
	//( (CListCtrl *)GetDlgItem(IDC_ADDFILE) )->SetOutlineColor( RGB(0,0,0) ); 
} 
 
//处理对列表框里的某一项的双击事件 
void CSimplyPlayerDlg::OnDbClkMusicList(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
	//结束当前歌曲(销毁当前句柄) 
	MCIWndDestroy(m_Audio); 
	m_Audio = NULL; 
 
	CString m_Path, MusicName, strIndex; 
 
	index = m_AddList.GetSelectionMark(); 
	strIndex.Format("%d:", index+1); 
	m_AddList.SetSelectionMark( index ); 
 
	if( m_AddList.GetItemCount() > 0 && index != -1) 
	{ 
		FilePath *cur = FindItem(head, index); 
		m_Path = cur->m_Path; 
		 
		OnPlay(m_Path, strIndex); 
	} 
	if( index == -1) 
	{ 
		MessageBox(_T("如果还未添加歌曲,请添加歌曲到列表中(可选择多个文件)!\n如果列表中已有歌曲,请双击你要播放的歌曲!\r\n\n     祝你使用本软件愉快,发现BUG时,请告诉我,不甚感激!\r\n\t     QQ:276244858 E-MAIL:yijshu@163.com"), _T("友情提醒 → By Stefanie924") ); 
	} 
	 
	*pResult = 0; 
} 
 
//找寻链表中第index个结点  
FilePath*  CSimplyPlayerDlg::FindItem(FilePath *head, int index) 
{ 
	FilePath  *cur; 
	cur = head->next; 
	int i= 0; 
	while( i < index && cur != NULL) 
	{ 
		cur = cur->next; 
		i++; 
	} 
	return cur; 
} 
 
 
//根据完整的文件路径名得到歌曲信息 
CString CSimplyPlayerDlg::PathNameConvertFileName(CString m_Path) 
{ 
	CString MusicName = m_Path; 
	CString strArtist, strSongTitle, strMusicInfo; 
	//获取歌手名与歌曲名 
	strArtist = GetMusicArtist(m_Path); 
	strSongTitle = GetSongTitle(m_Path); 
 
	//把路径名转换成文件名 
	MusicName.MakeReverse(); 
	MusicName.Delete(0,4); 
	int nPos = MusicName.Find("\\"); 
	MusicName.Delete( nPos, MusicName.GetLength() - nPos ); 
	MusicName.MakeReverse(); 
 
	CString strSpace = _T("");//用来对齐的空格字符串,(设置了歌手的长度最大为12字节) 
	//mp3TAG信息里,歌手名与歌曲均不为空时 
	if( strArtist != _T("") && strSongTitle == _T("") ) 
	{ 
		int i=0, len = 12 - strArtist.GetLength(); //对齐的空格数 
		while( i < len) 
		{ 
			strSpace.Insert(i, _T(" ")); 
			i++; 
		} 
		 
		strMusicInfo = strArtist + strSpace + MusicName; 
		return strMusicInfo; 
	} 
	//歌手信息为空时,直接返回歌曲名 
	else if( strArtist == _T("") && strSongTitle != _T("") ) 
	{ 
		return strSongTitle; 
	} 
	//歌手信息与歌曲信息均为空时,直接返回文件名 
	else 
	{ 
		return MusicName; 
	} 
} 
 
CString CSimplyPlayerDlg::GetMusicArtist(CString m_Path) 
{ 
	CString strArtist; 
	CMp3Tags mp3Info; 
	if( mp3Info.OpenFile( m_Path) == -1 ) 
	{ 
		//MessageBox("读取路径文件失败!"); 
		strArtist.Format(_T("")); 
		 
	} 
	else 
	{ 
		strArtist = mp3Info.m_strArtist; 
		mp3Info.CloseFile(); 
	} 
 
	//由于在mp3tag类里设置了m_strSongTitle结束符,因此不能用于CString 的 重载+法运算,所以在歌手与歌曲信息最后作了个标志"@" 
	//这样便能删除掉正确信息后面的多余信息,并可以用于+法运算 
	int n = strArtist.Find("@"); 
	strArtist.Delete( n, strArtist.GetLength() - n ); 
	 
	return strArtist; 
} 
 
CString CSimplyPlayerDlg::GetSongTitle(CString m_Path) 
{ 
	CString strSongTitle; 
	CMp3Tags mp3Info; 
	if( mp3Info.OpenFile( (LPCTSTR)m_Path) == -1 ) 
	{ 
		//MessageBox("读取路径文件失败!"); 
		strSongTitle.Format(_T("")); 
	} 
	else 
	{ 
		strSongTitle = mp3Info.m_strSongTitle; 
		mp3Info.CloseFile(); 
	} 
	 
	//由于在mp3tag类里设置了m_strSongTitle结束符,因此不能用于CString 的 重载+法运算,所以在歌手与歌曲信息最后作了个标志"@" 
	//这样便能删除掉正确信息后面的多余信息,并可以用于+法运算 
	int n = strSongTitle.Find("@"); 
	strSongTitle.Delete( n, strSongTitle.GetLength() - n ); 
	 
	 
	return strSongTitle; 
} 
 
CString  CSimplyPlayerDlg::GetMusicInfo(CString m_Path, CString strIndex) 
{ 
	CString strMusicName, strFileName; 
	//读取MP3文件获取歌曲的歌手名与歌曲名 
	CString strArtist = GetMusicArtist(m_Path); 
	CString strSongTitle = GetSongTitle(m_Path); 
 
	strFileName = PathNameConvertFileName(m_Path); 
 
	if(strArtist != _T("") && strSongTitle != _T("")) 
	{ 
		strMusicName = strIndex + strArtist + " → " + strSongTitle; 
	} 
	else if(strArtist != _T("") && strSongTitle == _T("") ) 
	{ 
		strMusicName = strIndex + strArtist + " → " + strFileName; 
	} 
	else if( strArtist == _T("") && strSongTitle != _T("") ) 
	{ 
		 
		strMusicName =strIndex + strSongTitle; 
	} 
	else 
	{ 
		strMusicName =strIndex + strFileName; 
	} 
	 
	return strMusicName; 
} 
 
void CSimplyPlayerDlg::OnDeletelist() 
{ 
	if(m_AddList.GetItemCount() > 0) 
	{ 
		if(MessageBox(_T("此操作将清空列表中所有歌曲,并结束当前歌曲,请确认是否执行此操作!"), _T("注意!"), MB_ICONEXCLAMATION  | MB_YESNO) == IDYES ) 
		{ 
			// 删除列表中所有的项 
			m_AddList.DeleteAllItems(); 
			//结束当前正在唱的歌曲(销毁其句柄) 
			MCIWndDestroy( m_Audio ); 
			m_Audio = NULL; 
			//删除链表中所保存的路径信息 
			delete head; 
			 
			//重新构造全局的存储歌曲路径的链表头结点 
			head = new FilePath(); 
			head->nItem = 0; 
			head->m_Path = _T(""); 
			head->next = NULL; 
			pEnd= head; 
 
			m_FileName.SetWindowText(  _T("提示:列表被清空,请重新添加!") ); 
			m_Status.SetWindowText( _T("") ); 
 
			m_Pause.EnableWindow(FALSE); 
			m_Stop.EnableWindow( FALSE ); 
			m_Random.EnableWindow(FALSE); 
			m_Front.EnableWindow(FALSE); 
			m_Next.EnableWindow(FALSE); 
			//对列表框中的歌曲重新排列 
			num = 0; 
		} 
	} 
	else 
	{ 
		MessageBox( _T("列表中无歌曲,请先打开或添加歌曲到列表中!"), _T("友情提醒:") ); 
	} 
} 
 
 
//输出选中的多个歌曲文件,并转换路径名为歌曲名 
void CSimplyPlayerDlg::OutputItem(CString m_Path) 
{ 
	CString strMusicName, strNumber, strMusicTime; 
 
	temp = new FilePath(); 
	temp->nItem = num; 
	temp->m_Path = m_Path; 
	temp->next = NULL; 
	pEnd->next = temp; 
	pEnd = temp; 
	 
 
	//调用转换函数把路径名转换成歌曲名 
	strMusicName = PathNameConvertFileName(m_Path); 
 
	//把相应信息(ID 歌曲名 歌曲时间)插入列表控件中 
	strNumber.Format("%d",num+1); 
	m_AddList.InsertItem(num, strNumber, NULL); 
	m_AddList.SetItemText(num, 1, strMusicName ); 
	strMusicTime = GetAboutMusicTime(m_Path); 
	m_AddList.SetItemText(num, 2, strMusicTime); 
	 
	num++;		 
 
	 
} 
 
//对话框上的“退出”按钮的消息响应 
void CSimplyPlayerDlg::OnDlgExit() 
{ 
	//发出程序退出消息 
	PostMessage(WM_QUIT); 
	//删除在托盘下的图标 
	ToTray(FALSE); 
} 
 
//获取歌曲时间长度  
//(注:由于水平有限,没有读取到MP3文件的MPEG信息,如用来计算时间的帧频率,帧数,等 
//所以在初始化添加文件时默认以128kbps的帧频率为标准计算时间,再到具体播放到哪一首歌曲时再用MCI计算精确时间) 
CString CSimplyPlayerDlg::GetAboutMusicTime( CString m_Path ) 
{ 
	    //以默认的128kbps计算mp3时间,这样会造成误差 (权宜之计,因为计算准确时间只有待到歌曲播放时) 
		CString   strLength;	 
		DWORD   dwLength=0; 
		CFileStatus   fStatus; 
		CFile::GetStatus(m_Path,fStatus); 
 
		dwLength=(DWORD)(fStatus.m_size/16000); //文件尺寸除以数据流速(以128kbps的mp3为例128kbps/8=16000) 
		strLength.Format("%d:%02d",   dwLength/60,   dwLength%60); 
 
		return strLength; 
} 
 
//获得MP3歌曲的精确时间,但必须是当前正在播放的歌曲,也就是MCI正在打开的歌曲 
CString CSimplyPlayerDlg::GetTruthMusicTime( CString m_Path) 
{ 
		//用MCI获得当前播放歌曲的精确时间 
		CString strMusicTime, strTimeFormat; 
		//设置MCI获取的时间格式为"ms"(即毫秒) 
		strTimeFormat.Format(_T("ms")); 
		int total, min, sec; 
		total = ( MCIWndGetLength(m_Audio) - MCIWndGetStart(m_Audio) ) / 1000 ; 
		min = total/60; 
		sec = total%60; 
		strMusicTime.Format("%d:%02d", min, sec); 
		 
		return strMusicTime; 
} 
 
 
void CSimplyPlayerDlg::OnRandom() 
{ 
	//当按随机播放时 
	if(bRand == TRUE) 
	{ 
		m_Random.SetWindowText(_T("顺序")); 
		 
		bRand = FALSE;	 
	} 
	//顺序播放时 
	else 
	{ 
		m_Random.SetWindowText(_T("随机")); 
		bRand = TRUE; 
	} 
} 
 
//随机播放 
void CSimplyPlayerDlg::OnRandomPlay() 
{ 
	CString m_Path, strIndex; 
	 
	index = rand() % num; 
	strIndex.Format("%d:", index+1); 
	m_AddList.SetSelectionMark( index ); 
	 
	FilePath *cur = FindItem(head, index); 
	m_Path = cur->m_Path; 
	 
	OnPlay(m_Path, strIndex); 
	//更改暂停标志 
	bPause = FALSE; 
	OnPause(); 
} 
 
//顺序播放 
void CSimplyPlayerDlg::OnOrderPlay() 
{ 
	CString m_Path, strIndex; 
 
	index++; 
 
	FilePath *cur = FindItem(head, index); 
	if(cur == NULL) 
	{ 
		index = 0; 
		cur = head->next; 
	} 
 
	strIndex.Format("%d:", index+1); 
	m_AddList.SetSelectionMark( index ); 
	m_Path = cur->m_Path; 
	 
	OnPlay(m_Path, strIndex); 
	//更改暂停标志 
	bPause = FALSE; 
	OnPause(); 
} 
 
HBRUSH CSimplyPlayerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
{ 
	//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
	 
	//设置静态文本控件为透明,并设置其文本颜色 
	if(pWnd->GetDlgCtrlID() == IDC_FILENAME || pWnd->GetDlgCtrlID() == IDC_STATUS || pWnd->GetDlgCtrlID() == IDC_VOLUMECTRL ) 
	{ 
		pDC->SetBkMode(TRANSPARENT); 
		pDC->SetTextColor( RGB(72, 72 ,72) ); 
	} 
 
	if(pWnd->GetDlgCtrlID() == IDC_VOLUME ) 
	{ 
		pDC->SetBkMode(TRANSPARENT); 
	} 
	 
	 
	return m_brush; 
} 
 
//播放上一曲 
void CSimplyPlayerDlg::OnFrontMusic() 
{ 
	//结束当前歌曲 
	MCIWndDestroy(m_Audio); 
	m_Audio = NULL; 
	 
	CString m_Path, strIndex; 
	FilePath *cur; 
	 
	if(bRand == FALSE ) 
	{ 
		//当不是第一首歌曲时,取上首歌曲 
		if(index != 0  ) 
		{ 
			index--; 
			cur = FindItem(head, index); 
		} 
		else //是第一首歌曲,当始终指向第一首歌曲 
		{ 
			cur = head->next; 
		} 
 
		strIndex.Format("%d:", index+1); 
		m_AddList.SetSelectionMark( index ); 
		m_Path = cur->m_Path; 
	 
		OnPlay(m_Path, strIndex); 
 
		//更改暂停标志 
		bPause = FALSE; 
		OnPause(); 
		 
	} 
	else 
	{ 
		OnRandomPlay(); 
	} 
} 
 
//播放下一曲 
void CSimplyPlayerDlg::OnNextMusic() 
{ 
	//结束当前歌曲 
	MCIWndDestroy(m_Audio); 
	m_Audio = NULL; 
 
	//判断随机的标志来进行播放 
	if(bRand == TRUE ) 
	{ 
		OnRandomPlay(); 
	} 
	else 
	{ 
		OnOrderPlay();	 
	} 
}