首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

打造自動循環播放的 MP3 播放器(上):需求分析與核心架構設計

     編輯:VC 教學

專案背景與需求

企業文化建設中,定時播放背景音樂是常見需求。本專案旨在開發一款全自動、駐留系統托盤、無需人工干預的 MP3 播放器,依據公司作息時間(早、午、晚三個時段)自動循環播放指定目錄下的音樂,時段結束自動停止。程式啟動後僅在托盤顯示圖示,配置完成即可長期無人值守運行。

核心技術亮點

本軟體整合了 Windows 程式設計中多項實用技術:

  1. 目錄/多檔案選擇對話框:支援一次選取多首音樂,自動解析副檔名過濾。
  2. 系統托盤駐留:隱藏工作列按鈕 (WS_EX_TOOLWINDOW),透過 Shell_NotifyIcon 於通知區建立互動圖示。
  3. 自繪進度條與音量控制:即時顯示播放進度、支援拖曳定位與音量調節。
  4. 多重定時器協作:高頻定時器更新 UI、秒級定時器處理排程邏輯、播放結束自動切換下一曲。
  5. 超連結按鈕與客製化 UI:彩色橢圓按鈕、標題列、點擊開啟電子郵件等視覺強化。

實現原理:以定時器為核心的事件驅動架構

程式啟動即進入訊息迴圈,三個定時器分工明確:

  • Timer 1 (1000ms):排程檢查器,判斷當前時間是否進入播放時段,觸發播放/停止。
  • Timer 2 (1000ms):播放監控器,偵測單曲播放結束,自動呼叫 PlayNext() 實現循環。
  • Timer 4 (100ms):UI 更新器,刷新進度條位置、播放時間顯示、音量滑桿狀態。

關鍵類別與資料結構

成員變數類型用途
m_MusicListCComboBox音樂清單下拉選單,顯示檔名
m_MusicAryCStringArray儲存完整路徑,與 m_MusicList 索引對應
m_MusicCCOMMCIMCI 多媒體控制介面封裝類,負責實際播放
m_MPBarCScrollBar播放進度條
m_VolumeCSliderCtrl音量調節滑桿
m_bAutoRunBOOL是否啟用自動排程模式

核心程式碼解析

1. 開啟音樂檔案 (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));
        }
    }
}

2. 播放核心函式 (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 播放器(下)》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved