|
【实现内容】自动循环播放的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);
- }
复制代码 |
|