企業文化建設中,定時播放背景音樂是常見需求。本專案旨在開發一款全自動、駐留系統托盤、無需人工干預的 MP3 播放器,依據公司作息時間(早、午、晚三個時段)自動循環播放指定目錄下的音樂,時段結束自動停止。程式啟動後僅在托盤顯示圖示,配置完成即可長期無人值守運行。
本軟體整合了 Windows 程式設計中多項實用技術:
WS_EX_TOOLWINDOW),透過 Shell_NotifyIcon 於通知區建立互動圖示。程式啟動即進入訊息迴圈,三個定時器分工明確:
PlayNext() 實現循環。| 成員變數 | 類型 | 用途 |
|---|---|---|
| m_MusicList | CComboBox | 音樂清單下拉選單,顯示檔名 |
| m_MusicAry | CStringArray | 儲存完整路徑,與 m_MusicList 索引對應 |
| m_Music | CCOMMCI | MCI 多媒體控制介面封裝類,負責實際播放 |
| m_MPBar | CScrollBar | 播放進度條 |
| m_Volume | CSliderCtrl | 音量調節滑桿 |
| m_bAutoRun | BOOL | 是否啟用自動排程模式 |
OnOpen)支援多選、多格式過濾,將完整路徑存入陣列,檔名顯示於 ComboBox:
void CMp3PlayerDlg::OnOpen()
{
m_MusicList.ResetContent();
m_MusicAry.RemoveAll();
m_Music.Close();
Init();
m_Pause.SetWindowText(_T("暫停"));
// 建立多格式過濾字串
CString filter = _T("媒體檔案(所有類型)|*.cda;*.mid;*.rmi;*.midi;*.asf;*.wm;*.wma;*.asx;*.wax;*.m3u;*.wvx;")
_T("*.mpeg;*.mpg;*.m1v;*.mp3;*.avi;*.wmv;*.wav;*.snd;*.au;*.aif;*.aifc|");
filter += _T("CD 音樂曲目(*.cda)|*.cda|")
_T("MIDI 檔案(*.mid;*.rmi;*.midi)|*.mid;*.rmi;*.midi|")
_T("Windows Media 檔案(*.asf;*.wm;*.wma;*.wa?)|*.asf;*.wm;*.wma;|")
_T("媒體播放清單(*.asx;*.wax;*.m3u;*.wvx)|*.asx;*.wax;*.m3u;*.wvx|")
_T("電影檔案(*.mpeg;*.mpg;*.m1v;*.mp3)|*.mpeg;*.mpg;*.m1v;*.mp3|")
_T("視訊檔案(*.avi;*.wmv)|*.avi;*.wmv|")
_T("音訊檔案(*.wav;*.snd;*.au;*.aif;*.aifc)|*.wav;*.snd;*.au;*.aif;*.aifc|")
_T("所有檔案(*.*)|*.*||");
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, filter);
if (dlg.DoModal() == IDOK)
{
POSITION pos = dlg.GetStartPosition();
while (pos != NULL)
{
CString str = dlg.GetNextPathName(pos);
m_MusicAry.Add(str);
int idx = str.ReverseFind('\\');
m_MusicList.AddString(idx == -1 ? str : str.Mid(idx + 1));
}
}
}
Play)關閉前一首、開啟新檔、設定進度條範圍、啟動播放監控定時器:
void CMp3PlayerDlg::Play(int 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; // 秒
m_sMusicLen.Format(_T("%d分%d秒"), m_nTime/60, m_nTime%60);
m_sMusicPos.Format(_T("%d分%d秒"), 0, 0);
UpdateData(FALSE);
m_MPBar.SetScrollRange(0, m_nTime); // 進度條範圍以秒為單位
m_Volume.SetRange(0, 1000);
m_Volume.SetPos(m_nVolume);
m_Music.Play(m_hWnd); // 開始播放,指定通知視窗
SetTimer(2, 1000, NULL); // 啟動播放結束監控定時器
}
下一篇將詳細講解:
OnHScroll) 精確控制播放位置敬請期待《打造自動循環播放的 MP3 播放器(下)》。