如果能夠在啟動應用程序過程中再相應地添加聲音文件的播放效果,那一定是件更令人高興的事情,針對這個問題,本實例介紹了如何在Visual C++開發的應用程序中播放聲音資源文件。
一、實現方法
為了保證程序的完整性,首先用文本編輯器(如記事本)打開應用程序的資源文件(.rc文件),在最後加入自己的聲音資源,如下IDW WAVE "c:\kav\sound\virus.wav",並保存資源文件。當然,開發人員也可以通過Visual C++的IDE環境向程序添加聲音資源,這不是本實例講述的重點,所以不再贅述。
一般情況下,為了實現啟動畫面和聲音同時播放的效果,可以在應用程序中要播放聲音的地方啟動另一線程,用來播放聲音,雖然本實例沒有啟動畫面,但是還是在一個線程中來實現聲音資源文件的播放。啟動線程的代碼如下:
AfxBeginThread((AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);
上述函數中sound為一個回調函數,該函數首先用AfxGetInstanceHandle()函數獲得應用程序實例的句柄,然後用函數FindResource()函數找到聲音資源,該函數原型如下:
HRSRC FindResource(
HMODULE hModule, // module handle
LPCTSTR lpName, // resource name
LPCTSTR lpType // resource type
)
函數中參數hModule為模塊句柄,lpName為資源名,lpType為資源類型名。
找到聲音資源後,用LoadResource()函數加裝載資源,該函數原型如下:
HGLOBAL LoadResource(
HMODULE hModule, // module handle
HRSRC hResInfo // resource handle
);
函數中參數hModule為模塊句柄,hResInfo為資源句炳。
最後調用LockResource()函數鎖定資源內存塊,並返回所標定內存塊的虛擬內存地址。如果該資源被成功鎖定的話,則返回值指向該資源開始處的第一個字節。注意:若上述四步中的任何一步發生問題,則返回並釋放相應的內存。接下去要做的事情就是使用sndPlaySound()函數來播放聲音資源文件了。
二、編程步驟
1、 啟動Visual C++6.0,生成一個單文檔視圖結構的應用程序,將該程序命名為"PlaySound";
2、 使用Class Wizard在應用程序的視圖類中添加鼠標"左鍵按下"的消息響應函數,同時為程序添加聲音文件資源IDW;
3、 添加代碼,編譯運行程序;
三、程序代碼
///////////////////////////////////////////////////////////
void CPlaySoundVIEw::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxBeginThread((AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);
CVIEw::OnLButtonDown(nFlags, point);
}
UINT CPlaySoundVIEw::sound(LPVOID pParam)
{
HINSTANCE h=AfxGetInstanceHandle();
HRSRC hr=FindResource(h,"IDW","WAVE");
HGLOBAL hg=LoadResource(h,hr);
LPSTR lp=(LPSTR)LockResource(hg);
sndPlaySound(lp,SND_MEMORY|SND_SYNC);
FreeResource(hg);
return 0;
}
四、小結
本實例探討了播放聲音資源文件的辦法,對於如何播放聲音文件,只要調用sndPlaySound()函數就可以了,主要的工作還是在如何實現資源文件的裝載上,其實在本書的一些實例中都涉及到了資源文件的裝載,雖然資源類型不同,但是實現方法還是大同小異的。至於如何自由的操作聲音文件,在《 基於Visual C++6.0的聲音文件操作 》中作了詳細探討,讀者朋友可以參閱該實例。