继昨天那个mcisendCommand界面播放器之上建立了一个实现基本功能 的播放器了。。
增加了播放模式、音乐文件显示的功能
播放模式是利用定时器来实现的。。
void CPlayTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == LOOP)
{
if (PlayMode()==MCI_MODE_STOP)
{
OnStop();
OnPlay();
KillTimer(ALLLOOP);
}
}
else if (nIDEvent == ALLLOOP)
{
if (PlayMode()==MCI_MODE_STOP)
{
OnStop();
m_PlayPos++;
if (m_PlayPos == m_SaveArray.GetSize())
{
m_PlayPos = 0;
}
OnPlay();
}
}
CDialog::OnTimer(nIDEvent);
}
//得到当得播放状态
DWORD CPlayTestDlg::PlayMode()
{
MCI_STATUS_PARMS Status;
Status.dwCallback=(DWORD)GetSafeHwnd();
Status.dwItem = MCI_STATUS_MODE;
Status.dwTrack = NULL;
mciSendCommand(m_DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)&Status);
return Status.dwReturn;
}
文件显示主要是利用CListCtrl这个控件来显示。。。
CFileDialog打开多个文件,并且保存到CArray中没有用容器一大杯剧啊。。。。看来还得改改代码才行。。。
//得到某个字字符最后出现的位置
int FindLast(CString cstr,char tChar)
{
int tRet;
char *pChar;
//库函数strchr。返回该字符在串中最后位置的指针
pChar=strrchr(cstr,tChar);
if(pChar)
tRet=int(pChar-cstr); //计算下标
else
tRet=-1;
return tRet;
}
BOOL CPlayTestDlg::OnOpen()
{
// TODO: Add your control notification handler code here
m_Temp.RemoveAll();
CFileDialog FileDlg(TRUE,"音乐文件",NULL, OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"mp3(*.mp3)|*.mp3|所有文件(*.*)|*.*||");
if (IDOK == FileDlg.DoModal())
{
POSITION pos = FileDlg.GetStartPosition();
while(pos!=NULL)
{
CSaveSound tSave;
tSave.PathName = FileDlg.GetNextPathName(pos);
//得到文件名。。。不知道FileDlg.GetFileTitle()为什么为空
tSave.SoundName = tSave.PathName.Right(tSave.PathName.GetLength()-FindLast(tSave.PathName,'\\')-1);
tSave.SoundName = tSave.SoundName.Left(FindLast(tSave.SoundName,'.'));
m_SaveArray.Add(tSave);
m_Temp.Add(tSave);
}
}
//添加到ListCtrl中
if (m_SaveArray.GetSize())
{
ShowListCtrl();
}
OnPlay(); //播放
this->GetDlgItem(IDC_LOOP)->EnableWindow(TRUE);
this->GetDlgItem(IDC_ALLLOOP)->EnableWindow(TRUE);
return TRUE;
}
播放器还没做完。。。
明天接着做播放器