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();
}
}