博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mcisendCommand界面播放器2

Posted on 2010-04-24 23:51  ccmfc  阅读(264)  评论(0编辑  收藏  举报

继昨天那个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;
}

播放器还没做完。。。

明天接着做播放器