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

VC++ 從資源播放 WAV 音效 (SND_MEMORY 實作)

     編輯:VC 教學

前言

將 WAV 音效檔內嵌於執行檔資源中,執行時直接從記憶體播放,可避免外部檔案相依、提升載入速度並簡化部署。關鍵在於使用 SND_MEMORY 旗標搭配 sndPlaySound / PlaySound API。

資源設定

  1. 方案總管 → 資源檔 .rc 右鍵 View Code。
  2. 手動加入資源定義 (資源編輯器不直接支援 WAVE 類型):
// 在 .rc 檔案中加入
MY_WAVE WAVE "C:\\Project\\Sounds\\cool.wav"

格式:ResourceName WAVE "AbsoluteFilePath"。資源名稱 MY_WAVE 即為後續程式碼使用的識別字串。

播放函式實作

BOOL PlayResourceWave(LPCTSTR pszResourceName)
{
    HINSTANCE hInst = AfxGetInstanceHandle();

    // 1. 尋找資源
    HRSRC hResInfo = FindResource(hInst, pszResourceName, _T("WAVE"));
    if (!hResInfo) return FALSE;

    // 2. 載入資源
    HGLOBAL hRes = LoadResource(hInst, hResInfo);
    if (!hRes) return FALSE;

    // 3. 鎖定資源取得記憶體指標
    LPVOID pResData = LockResource(hRes);
    if (!pResData) return FALSE;

    // 4. 從記憶體播放 (同步等待播放完成)
    BOOL bResult = sndPlaySound((LPCSTR)pResData, SND_MEMORY | SND_SYNC);

    // 5. 釋放資源 (Windows 會自動管理,但良好習慣可呼叫)
    FreeResource(hRes);

    return bResult;
}

呼叫範例

void CMyDlg::OnPlaySound()
{
    if (!PlayResourceWave(_T("MY_WAVE")))
        AfxMessageBox(_T("播放失敗:資源不存在或格式錯誤"));
}

旗標組合說明

常用組合:SND_MEMORY | SND_SYNC (阻塞播放)、SND_MEMORY | SND_ASYNC (背景播放)、SND_MEMORY | SND_ASYNC | SND_LOOP (背景循環)。

進階:使用 PlaySound API (支援更多控制)

BOOL PlayResourceWaveEx(LPCTSTR pszResourceName, DWORD dwFlags = SND_MEMORY | SND_SYNC)
{
    HINSTANCE hInst = AfxGetInstanceHandle();
    HRSRC hResInfo = FindResource(hInst, pszResourceName, _T("WAVE"));
    if (!hResInfo) return FALSE;
    HGLOBAL hRes = LoadResource(hInst, hResInfo);
    if (!hRes) return FALSE;
    LPVOID pResData = LockResource(hRes);
    if (!pResData) return FALSE;

    // PlaySound 支援更完整的旗標與範例
    BOOL bResult = PlaySound((LPCSTR)pResData, hInst, dwFlags);
    FreeResource(hRes);
    return bResult;
}

注意事項

  • 資源類型必須為 "WAVE" (區分大小寫),FindResource 第三參數需對應。
  • WAV 格式限制:sndPlaySound/PlaySound 僅支援標準 PCM WAV,不支援 MP3、ADPCM 等壓縮格式。
  • 大型音效檔:嵌入資源會增加執行檔體積,超過數 MB 建議改用外部檔案或串流播放 (mciSendString, DirectSound, XAudio2)。
  • Unicode 專案:資源名稱使用 _T() 宏,FindResource 自動處理 ANSI/Unicode 版本。

結語

資源嵌入 WAV 播放是簡單音效回饋 (按鈕點擊、錯誤提示、完成通知) 的最佳實踐。幾行 API 呼叫即可實現零外部相依的音效播放,適合中小型專案快速整合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
旗標作用
SND_MEMORY參數為記憶體指標而非檔案路徑 (必要)。
SND_SYNC同步播放,函式阻塞直到播放結束。
SND_ASYNC非同步播放,函式立即返回,背景播放。
SND_LOOP循環播放,需搭配 SND_ASYNC。
SND_NODEFAULT找不到聲音時不播放系統預設音效。