开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2040|回复: 9
收起左侧

[其它] 制作自动循环播放的MP3播放器

[复制链接]

结帖率:100% (11/11)
发表于 2013-8-3 16:07:05 | 显示全部楼层 |阅读模式   河北省衡水市

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

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

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

  1.  目录选择对话框

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

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

  4.  进度条的制作

  5.  定时器使用

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

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

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

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

  【主要控件】

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

  【主要程序段及说明】

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

  2.   {

  3.        m_MusicList.ResetContent();

  4.        m_MusicAry.RemoveAll();

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

  6.        Init();

  7.        m_Pause.SetWindowText("暂停");

  8.        //

  9.        CString filter = "媒体文件(所有类型)|*.cda;*.mid;*.rmi;*.midi;*.asf;*.wm;*.wma;*.asx;*.wax;*.m3u;*.wvx;
  10. *.mpeg;*.mpg;*.m1v;*.mp3;*.avi;*.wmv;*.wav;*.snd;*.au;*.aif;*.aifc|";

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

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

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


  14.                                     "媒体播放表(*.asx;*.wax;*.m3u;*.wvx)|*.asx;*.wax;*.m3u;*.wvx|" +
  15.                                     "电影文件(*.mpeg;*.mpg;*.m1v;*.mp3)|*.mpeg;*.mpg;*.m1v;*.mp3|" +

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

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

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

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

  20.        if(music.DoModal() == IDOK)

  21.        {

  22.               POSITION pos = music.GetStartPosition();

  23.               while (pos != NULL)

  24.               {

  25.                      CString str = music.GetNextPathName(pos);

  26.                      m_MusicAry.Add(str);

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

  28.                      if(index == -1)

  29.                             m_MusicList.AddString(str);

  30.                      else

  31.                      {

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

  33.                             m_MusicList.AddString(name);

  34.                      }

  35.               }

  36.        }

  37.   }



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

  39.   {

  40.        m_Music.Close();

  41.        m_MusicList.SetCurSel(index);


  42.        CString sPath = m_MusicAry.GetAt(index);
  43.        m_Music.Open(sPath);

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

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

  46.        m_nPos = 0;

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

  48.        //

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

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

  51.        //

  52.        UpdateData(false);

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

  54.        //

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

  56.        m_Volume.SetPos(m_nVolume);

  57.        //

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

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

  60.   }
复制代码
  1. BOOL CMp3PlayerDlg::OnInitDialog()//初始化函数
  2. {

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

  4.        COwnerDrawDialog::OnInitDialog();

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

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

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

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

  9.        SetTimer(4,100,NULL);//启动4号定时器
复制代码
  1.     if(m_bAutoRun)

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

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

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

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

  6.        //

  7.        NOTIFYICONDATA tnd;

  8.        tnd.cbSize=sizeof(NOTIFYICONDATA);

  9.        tnd.hWnd=this->m_hWnd;

  10.        tnd.uID=IDI_MAINFRAME;

  11.        tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;

  12.        tnd.uCallbackMessage=WM_DLG_SHOW;

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

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

  15.        Shell_NotifyIcon(NIM_ADD,&tnd);

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

  17. }
复制代码

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

  2. {

  3.        if(pScrollBar == &m_MPBar)

  4.        {
复制代码
  1.     switch(nSBCode)
  2.               {

  3.               case SB_THUMBTRACK:



  4.                      m_nPos = nPos;

  5.                      break;

  6.               }

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

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

  9.               if(m_bPause)

  10.               {

  11.                      m_bPause = false;

  12.                      m_Pause.SetWindowText("暂停");

  13.               }

  14.               m_Music.Play(this->m_hWnd);

  15.        }

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

  17. }
复制代码

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

  2. {

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

  4.        UINT uMouseMsg;//鼠标动作

  5.        POINT pt;

  6.        uID=(UINT) wParam;

  7.        uMouseMsg=(UINT) lParam;

  8.        GetCursorPos(&pt);

  9.        if(uID == IDI_MAINFRAME)

  10.        {

  11.               if(uMouseMsg==WM_LBUTTONDOWN)//如果是单击左键,则弹出窗口
复制代码
  1.              {
  2.                      if(!IsIconic())

  3.                             {

  4.                                    ShowWindow(SW_NORMAL);

  5.                                    return true;

  6.                             }

  7.                      ShowWindow(SW_NORMAL);

  8.               }

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

  10.               {

  11.                      CMenu menu;

  12.                      menu.LoadMenu(IDR_MENU);

  13.                      CMenu *popMenu = menu.GetSubMenu(0);

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

  15.               }
  16.        }

  17.        return true;

  18. }
复制代码

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

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

  4.        {
  5.               //

  6.               Init();

  7.               if(!m_bAutoRun)

  8.               {

  9.                      return;

  10.               }

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

  12.               {

  13.                      return;

  14.               }
复制代码


  1.               //
  2.               m_CFile.ReadSetInfo(m_SetInfo);

  3.               SYSTEMTIME sysTime;

  4.               GetLocalTime(&sysTime);

  5.               m_CFile.ReadDayInfo(sysTime.wDayOfWeek,m_Info);

  6.               m_CFile.Close();

  7.               int hour = GetHour(m_Info.sSStarttime);

  8.               int minute = GetMinute(m_Info.sSStarttime);

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

  10.               {

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

  12.                      m_nPlay = 0;

  13.                      Play(0);

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

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

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

  17.                      m_nFlag = 1;

  18.                      return;

  19.               }

  20.               hour = GetHour(m_Info.sMStarttime);

  21.               minute = GetMinute(m_Info.sMStarttime);

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

  23.               {

  24.                      ReadCatalogMusic(m_Info.sMMusic);

  25.                      m_nPlay = 0;

  26.                      Play(0);

  27.                      KillTimer(1);

  28.                      int duration = atoi(m_Info.sMDuration);

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

  30.                      m_nFlag = 2;
复制代码
  1.           return;
  2.               }

  3.               hour = GetHour(m_Info.sEStarttime);

  4.               minute = GetMinute(m_Info.sEStarttime);

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

  6.               {

  7.                      ReadCatalogMusic(m_Info.sEMusic);

  8.                      m_nPlay = 0;

  9.                      Play(0);

  10.                      KillTimer(1);

  11.                      int duration = atoi(m_Info.sEDuration);

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

  13.                      m_nFlag = 3;

  14.                      return;

  15.               }

  16. //            SetTimer(1,1000,NULL);

  17.               m_CFile.Close();

  18.        }

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

  20.        {

  21.               if(m_Music.IsOpen())

  22.               {

  23.                      m_Music.Close();

  24.                      SetTimer(1,1000,NULL);

  25.                      KillTimer(2);

  26.                      KillTimer(3);

  27.               }

  28.               return;

  29.        }
复制代码

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

  3.               ShowWindow(SW_HIDE);

  4.               KillTimer(4);

  5.               return;

  6.        }

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

  8.        {

  9.               m_nPos += 1;

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

  11.               UpdateData(false);

  12.               m_MPBar.SetScrollPos(m_nPos);

  13.               if(m_nPos >= m_nTime)

  14.               {

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

  16.                      {

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

  18.                             {

  19.                                    m_nPlay = 0;

  20.                                    Play(0);

  21.                                    m_MPBar.SetScrollPos(0);
复制代码
  1.                        }
  2.                             else

  3.                             {

  4.                                    //进入睡眠

  5.                                    m_Music.Close();

  6.                                    SetTimer(1,1000,NULL);

  7.                                    KillTimer(2);

  8.                                    KillTimer(3);

  9.                                    return;

  10.                             }

  11.                      }

  12.                      else

  13.                      {

  14.                             Play(++m_nPlay);

  15.                             m_MPBar.SetScrollPos(0);

  16.                      }

  17.               }

  18.        }

  19.        COwnerDrawDialog::OnTimer(nIDEvent);

  20. }
复制代码

签到天数: 12 天

发表于 2023-12-28 14:24:29 | 显示全部楼层   广东省珠海市

啊啊啊 VC板块活了,你们加油
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2023-11-8 07:10:33 | 显示全部楼层   浙江省台州市
111111111111111111111111111111
回复 支持 反对

使用道具 举报

发表于 2014-9-29 17:33:27 | 显示全部楼层   湖北省黄冈市
这是什么跟什么呀
回复 支持 反对

使用道具 举报

发表于 2014-4-24 10:49:34 | 显示全部楼层   陕西省安康市
学习学习。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-9-24 12:28:34 | 显示全部楼层   湖北省黄冈市
这就是传说中的c吗?
回复 支持 反对

使用道具 举报

签到天数: 11 天

发表于 2013-9-17 19:17:06 | 显示全部楼层   宁夏回族自治区中卫市
啊啊啊 VC板块活了,你们加油
回复 支持 反对

使用道具 举报

结帖率:92% (12/13)
发表于 2013-8-28 19:44:33 | 显示全部楼层   山东省日照市
天哪,直接发附件行吗??
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
 楼主| 发表于 2013-8-3 16:09:54 | 显示全部楼层   河北省衡水市
夏洛的网 发表于 2013-8-3 16:09
啊啊啊 VC板块活了,你们加油

托您老的福
回复 支持 反对

使用道具 举报

结帖率:33% (1/3)
发表于 2013-8-3 16:09:04 | 显示全部楼层   湖南省怀化市
啊啊啊 VC板块活了,你们加油
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表