登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

制作自动循环播放的MP3播放器(上)  

2008-05-13 12:03:06|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

【实现内容】自动循环播放的MP3播放器

  【应用】自动循环播放的MP3播放器主要用于企业文化的应用。在每天的休息时段,播放器自动循环播放指定的MP3音乐。本自动播放器主要根据本公司的情况编写,包括早上上班,中午吃饭和下午下班三个时间段各播放1小时左右的音乐。播放器启动后,只在托盘中有图标,配置好各个时间段的音乐目录后,不需要人工干预,音乐可以自动启动、循环播放和结束。现已在本公司使用。

  【特点】本软件用到许多常用的技巧:

  1.  目录选择对话框

  2.  文件选择对话框中的多个文件类型过滤设定

  3.  应用程序在任务栏上隐藏,而在托盘上显示图标

  4.  进度条的制作

  5.  定时器使用

  6.  带有链接功能的按钮――点击按钮可以打开电子信箱

  7.  椭圆型的彩色按钮,彩色文本

  8.  彩色标题条,彩色标题文字。等等

  【实现原理】主要使用定时器。程序一旦运行,定时器将每秒响应一次。直到手工退出程序。

  【主要控件】

  m_MusicList---ComboBox类型  音乐文件列表

  【主要程序段及说明】

  void CMp3PlayerDlg::OnOpen() //点击打开按钮,选择音乐文件。可以多选

  {

       m_MusicList.ResetContent();

       m_MusicAry.RemoveAll();

       m_Music.Close();   //m_Music是CCOMMCI对象

       Init();

       m_Pause.SetWindowText("暂停");

       //

       CString filter = "媒体文件(所有类型)|*.cda;*.mid;*.rmi;*.midi;*.asf;*.wm;*.wma;*.asx;*.wax;*.m3u;*.wvx;

*.mpeg;*.mpg;*.m1v;*.mp3;*.avi;*.wmv;*.wav;*.snd;*.au;*.aif;*.aifc|";

       filter = filter +"CD音乐曲目(*.cda)|*.cda|" +

                                    "MIDI文件(*.mid;*.rmi;*.midi)|*.mid;*.rmi;*.midi|" +

                                    "Windows Media文件(*.asf;*.wm;*.wma;*.wa?)|*.asf;*.wm;*.wma;|" +

 


                                    "媒体播放表(*.asx;*.wax;*.m3u;*.wvx)|*.asx;*.wax;*.m3u;*.wvx|" +

                                    "电影文件(*.mpeg;*.mpg;*.m1v;*.mp3)|*.mpeg;*.mpg;*.m1v;*.mp3|" +

                                    "视频文件(*.avi;*.wmv)|*.avi;*.wmv)|" +

                                    "音频文件(*.wav;*.snd;*.au;*.aif;*.aifc)|*.wav;*.snd;*.au;*.aif;*.aifc|" +

                                    "所有文件(*.*)|*.*|";

       CFileDialog music(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,filter);

       if(music.DoModal() == IDOK)

       {

              POSITION pos = music.GetStartPosition();

              while (pos != NULL)

              {

                     CString str = music.GetNextPathName(pos);

                     m_MusicAry.Add(str);

                     int index = str.ReverseFind('\\');

                     if(index == -1)

                            m_MusicList.AddString(str);

                     else

                     {

                            CString name = str.Mid(index + 1);

                            m_MusicList.AddString(name);

                     }

              }

       }

  }




  void CMp3PlayerDlg::Play(int index)//播放函数,index为曲目的序号

  {

       m_Music.Close();

       m_MusicList.SetCurSel(index);

 


       CString sPath = m_MusicAry.GetAt(index);

       m_Music.Open(sPath);

       m_Status.SetWindowText(sPath + _T(" 正在播放..."));//在状态条中显示提示信息

       m_nLength = m_Music.GetLength();//获取音乐长度

       m_nPos = 0;

       m_nTime = m_nLength/1000;//除以1000即为播放时间

       //

       m_sMusicLen.Format("%d分%d秒",m_nTime/60,m_nTime%60);//显示播放时间

       m_sMusicPos.Format("%d分%d秒",m_nPos/60,m_nPos%60);//显示当前播放位置

       //

       UpdateData(false);

       m_MPBar.SetScrollRange(0,m_nTime);//设置音乐播放的进度条范围

       //

       m_Volume.SetRange(0,1000);//设置音量调节范围

       m_Volume.SetPos(m_nVolume);

       //

       m_Music.Play(this->m_hWnd);//开始播放

       SetTimer(2,1000,NULL);//启动2号定时器

  }



BOOL CMp3PlayerDlg::OnInitDialog()//初始化函数

{

       m_DlgStyle.sTitleName = "音乐播放器";//设定标题

       COwnerDrawDialog::OnInitDialog();

       // Set the icon for this dialog.  The framework does this automatically

       //  when the application's main window is not a dialog

       SetIcon(m_hIcon, TRUE);                 // Set big icon

       SetIcon(m_hIcon, FALSE);         // Set small icon

       SetTimer(4,100,NULL);//启动4号定时器


  ///////////////


       if(m_bAutoRun)

              SetTimer(1,1000,NULL);//如果是自动播放,则启动1号定时器

       //以下为应用程序隐藏任务栏,放到托盘中去的程序

       long wl = GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE);

       SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,WS_EX_TOOLWINDOW);

       //

       NOTIFYICONDATA tnd;

       tnd.cbSize=sizeof(NOTIFYICONDATA);

       tnd.hWnd=this->m_hWnd;

       tnd.uID=IDI_MAINFRAME;

       tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;

       tnd.uCallbackMessage=WM_DLG_SHOW;

       tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_MAINFRAME));

       strcpy(tnd.szTip,"音乐播放器");

       Shell_NotifyIcon(NIM_ADD,&tnd);

       return TRUE;  // return TRUE  unless you set the focus to a control

}

 

  =================


void CMp3PlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //拖动音乐播放进度条

{

       if(pScrollBar == &m_MPBar)

       {

 


              switch(nSBCode)

              {

              case SB_THUMBTRACK:

 

                     m_nPos = nPos;

                     break;

              }

              m_MPBar.SetScrollPos(m_nPos);//改变进度条位置

              m_Music.Seek(m_nPos*1000);//改变音乐播放进度

              if(m_bPause)

              {

                     m_bPause = false;

                     m_Pause.SetWindowText("暂停");

              }

              m_Music.Play(this->m_hWnd);

       }

       COwnerDrawDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}


  =================


LRESULT CMp3PlayerDlg::OnDlgShow(WPARAM wParam,LPARAM lParam)//系统托盘下鼠标点击图标响应函数

{

       UINT uID;//发出该消息的图标的ID

       UINT uMouseMsg;//鼠标动作

       POINT pt;

       uID=(UINT) wParam;

       uMouseMsg=(UINT) lParam;

       GetCursorPos(&pt);

       if(uID == IDI_MAINFRAME)

       {

              if(uMouseMsg==WM_LBUTTONDOWN)//如果是单击左键,则弹出窗口

 


              {

                     if(!IsIconic())

                            {

                                   ShowWindow(SW_NORMAL);

                                   return true;

                            }

                     ShowWindow(SW_NORMAL);

              }

              else if(uMouseMsg == WM_RBUTTONDOWN)//点击右键则弹出右键菜单

              {

                     CMenu menu;

                     menu.LoadMenu(IDR_MENU);

                     CMenu *popMenu = menu.GetSubMenu(0);

                     popMenu->TrackPopupMenu(TPM_LEFTBUTTON,pt.x,pt.y,this);

              }
       }

       return true;

}


  ===============


void CMp3PlayerDlg::OnTimer(UINT nIDEvent) //定时器处理

{
       if(nIDEvent == 1)//1号定时器,主要处理自动播放功能

       {
              //

              Init();

              if(!m_bAutoRun)

              {

                     return;

              }

              if(!m_CFile.Open())//如果有自动播放设置,则进行自动播放

              {

                     return;

              }


              //

              m_CFile.ReadSetInfo(m_SetInfo);

              SYSTEMTIME sysTime;

              GetLocalTime(&sysTime);

              m_CFile.ReadDayInfo(sysTime.wDayOfWeek,m_Info);

              m_CFile.Close();

              int hour = GetHour(m_Info.sSStarttime);

              int minute = GetMinute(m_Info.sSStarttime);

              if(sysTime.wHour == hour && sysTime.wMinute == minute)//开始播放上午音乐

              {

                     ReadCatalogMusic(m_Info.sSMusic);//读取配置文件中指定的上午播放音乐目录

                     m_nPlay = 0;

                     Play(0);

                     KillTimer(1); //终止1号定时器

                     int duration = atoi(m_Info.sSDuration);//读取播放时间段

                     SetTimer(3,duration*60*1000,NULL);//启动三号定时器

                     m_nFlag = 1;

                     return;

              }

              hour = GetHour(m_Info.sMStarttime);

              minute = GetMinute(m_Info.sMStarttime);

              if(sysTime.wHour == hour && sysTime.wMinute == minute)//开始播放中午音乐

              {

                     ReadCatalogMusic(m_Info.sMMusic);

                     m_nPlay = 0;

                     Play(0);

                     KillTimer(1);

                     int duration = atoi(m_Info.sMDuration);

                     SetTimer(3,duration*60*1000,NULL);

                     m_nFlag = 2;

             return;

              }

              hour = GetHour(m_Info.sEStarttime);

              minute = GetMinute(m_Info.sEStarttime);

              if(sysTime.wHour == hour && sysTime.wMinute == minute)//开始播放下午音乐

              {

                     ReadCatalogMusic(m_Info.sEMusic);

                     m_nPlay = 0;

                     Play(0);

                     KillTimer(1);

                     int duration = atoi(m_Info.sEDuration);

                     SetTimer(3,duration*60*1000,NULL);

                     m_nFlag = 3;

                     return;

              }

//            SetTimer(1,1000,NULL);

              m_CFile.Close();

       }

       if(nIDEvent == 3)//三号定时器,是播放时间段定时器,播放时间到了,就自动停止播放,启动1号定时器,等待下次播放的开始,同时关闭2号和3号定时器,终止播放。

       {

              if(m_Music.IsOpen())

              {

                     m_Music.Close();

                     SetTimer(1,1000,NULL);

                     KillTimer(2);

                     KillTimer(3);

              }

              return;

       }

    if(nIDEvent == 4)//4号定时器是为了马上隐藏窗口。也可以用MoveWindow之类的处理

       {

              ShowWindow(SW_HIDE);

              KillTimer(4);

              return;

       }

       if(nIDEvent == 2 && m_Music.IsOpen() && !m_bPause)//2号定时器是为了定时修改对话框中的各个控件状态,比如播放进度条,当前播放时间等

       {

              m_nPos += 1;

              m_sMusicPos.Format("%d分%d秒",m_nPos/60,m_nPos%60);

              UpdateData(false);

              m_MPBar.SetScrollPos(m_nPos);

              if(m_nPos >= m_nTime)

              {

                     if(m_nPlay == m_MusicAry.GetSize()-1)

                     {

                            if((m_bAutoRun && m_SetInfo.bCyc) || !m_bAutoRun)

                            {

                                   m_nPlay = 0;

                                   Play(0);

                                   m_MPBar.SetScrollPos(0);

                           }

                            else

                            {

                                   //进入睡眠

                                   m_Music.Close();

                                   SetTimer(1,1000,NULL);

                                   KillTimer(2);

                                   KillTimer(3);

                                   return;

                            }

                     }

                     else

                     {

                            Play(++m_nPlay);

                            m_MPBar.SetScrollPos(0);

                     }

              }

       }

       COwnerDrawDialog::OnTimer(nIDEvent);

}


【备注】:由于本软件用到许多辅助模块,在此不一一详解。如果有兴趣的朋友,可以留下EMAIL,笔者可以将程序免费送出。

  播放器图例
 





















 











 

  评论这张
 
阅读(909)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018