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

msciSendCommand播放器到此结束了。

Posted on 2010-04-25 22:10  ccmfc  阅读(289)  评论(0)    收藏  举报
功能:
实现播放、暂停、停止、上一曲、下一曲、删除、删除所有、单曲循环、全部循环、
(文件)文件路径显示、自定义音乐文件、播放进度、播放时间、音量设置(参考了网上的资料);
利用文件读写:保存音乐文件、保存上次未播放完的音乐信息
未完成的功能:歌词、进度条控制播放,没对界面进行处理
播放器到此结束了有时间我会把未完成的功能也写上的
大家可以下载下来参考参考,或者在此之上加一些功能

头次连着几天写一个软件。如果稍加修改下界面和一些功能。。。还不错的。。

呵呵。。

遇到的问题

1、CListCtrl问题刚开始我把它的属性设置成了排序的。。。如果显示出来的话只能显示出最后一个路径

2、CFileDialog问题读取多个文件后不能直接利用API来获得文件名

自己封装了一个函数来获得

//得到某个字字符最后出现的位置
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;
}

3、播放模式问题

没想到什么好的办法。。。只好利用定时器来解决此问题了

if (nIDEvent == LOOP)
 {
  
  if (GetPlayMode(MCI_STATUS_MODE)==MCI_MODE_STOP)
  {
   OnStop();
   OnPlay();
  }
 }
 else if (nIDEvent == ALLLOOP)
 {
  
  if (GetPlayMode(MCI_STATUS_MODE)==MCI_MODE_STOP)
  {
   OnStop();
   m_PlayPos++;
   if (m_PlayPos == m_SaveArray.GetSize())
   {
    m_PlayPos = 0;
   }
   OnPlay();
  }
 }

4、播放时间的显示

int Minute = 0;
 int Second = 0;
 unsigned long tTime;
 CString tTemp;
 tTime = GetPlayMode(MCI_STATUS_POSITION);

 tTime = tTime/1000;
 Minute = tTime/60;
 Second=tTime%60+1;
 if(Second==60)
 {
  Second=0;
 }
 tTemp.Format("%d:%d/%d:%d",Minute,Second,m_Minute,m_Second);
 this->SetDlgItemText(IDC_TIME,tTemp);

 

5、最后是音量的设置了

参考了网上的代码

主要利用了以下的消息函数来完成此功能
 afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
 afx_msg LONG OnMixerCtrlChange(UINT wParam, LONG lParam);

封装的函数

 //音量控制
 BOOL amdUninitialize();
 BOOL amdInitialize();
 BOOL amdGetMasterVolumeControl();
 BOOL amdGetMasterVolumeValue(DWORD &dwVal) const;
 BOOL amdSetMasterVolumeValue(DWORD dwVal) const;