
MFC中设置背景音乐问题#include必须包含这
文件#pragmacomment(lib,"Winmm.lib")必须包含这文件一定要进行PlaySound函数的声明为:BOOLPlaySound(LPCSTRpszSound,HMODULEhmod,DWORDfdwSound)第一种方法是直接播出
声音文件,相应的代码为:PlaySound("c:\\win95\\media\\TheMicrosoftSound.wav",NULL,SND_FILENAME|SND_ASYNC)注意参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。第二种方法是把声音文件加入到资源中,记住一定是wav格式的声音,然后从资源中
播放声音。VisualC++支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择TheMicrosoftSound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音:PlaySound((LPCTSTR)IDR_STARTWIN,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC)第三种方法是用PlaySound播放系统声音,Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC)函数sndPlaySound的功能与PlaySound类似,但少了一个参数。函数的声明为:BOOLsndPlaySound(LPCSTRlpszSound,UINTfuSound)除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。第四种方法:sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用:sndPlaySound(“MYSOUND.WAV”,SND_ASYNC)自己把资源添在Debug文件夹里。如下:voidCLotteryDlg::OnPlaySound(){srand((unsigned)time(NULL))intkk=rand()%4switch(k){case0:{PlaySound((LPCTSTR)IDR_WAVE,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC)break//天堂之泪}case1:{PlaySound((LPCTSTR)IDR_WAVE1,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC)break//亡灵序曲}case2:{PlaySound((LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC)break//戒不掉你的温柔}case3:{PlaySound((LPCTSTR)IDR_WAVE3,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC)break//客家人是有料}}//调用资源里的声音文件,音乐格式必须为:wav源程序清单如下: LPSTR szFileName//声音文件名 MMCKINFO mmckinfoParentMMCKINFO mmckinfoSubChunkDWORD dwFmtSizeHMMIO m_hmmio//音频文件句柄 DWORD m_WaveLongHPSTR lpData//音频数据 HANDLE m_hDataHANDLE m_hFormatWAVEFORMATEX * lpFormatDWORD m_dwDataOffsetDWORD m_dwDataSizeWAVEHDR pWaveOutHdrWAVEOUTCAPS pwocHWAVEOUT hWaveOut//打开波形文件 if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF))) { //File open Error Error("Failed to open the file.")//错误处理函数 return false} //检查打开文件是否是声音文件 mmckinfoParent.fccType =mmioFOURCC('W','A','V','E')if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF)) { //NOT WAVE FILE AND QUIT } //寻找 'fmt' 块 mmckinfoSubChunk.ckid =mmioFOURCC('f','m','t',' ')if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)) { //Can't find 'fmt' chunk } //获得 'fmt '块的大小,申请内存 dwFmtSize=mmckinfoSubChunk.cksize m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize))if(!m_hFormat) { //failed alloc memory } lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat)if(!lpFormat) { //failed to lock the memory } if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize) { //failed to read format chunk } //离开 fmt 块 mmioAscend(m_hmmio,&mmckinfoSubChunk,0)//寻找 'data' 块 mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a')if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)) { //Can't find 'data' chunk } //获得 'data'块的大小 m_dwDataSize=mmckinfoSubChunk.cksize m_dwDataOffset =mmckinfoSubChunk.dwDataOffset if(m_dwDataSize==0L) { //no data in the 'data' chunk } //为音频数据分配内存 lpData=new char[m_dwDataSize]if(!lpData) { //faile } if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0) { //Failed to read the data chunk } m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong)if(m_WaveLong<0) { //Failed to read the data chunk } //检查音频设备,返回音频输出设备的性能 if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0) { //Unable to allocate or lock memory } //检查音频输出设备是否能播放指定的音频文件 if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0) { //Failed to OPEN the wave out devices } //准备待播放的数据 pWaveOutHdr.lpData =(HPSTR)lpDatapWaveOutHdr.dwBufferLength =m_WaveLongpWaveOutHdr.dwFlags =0if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0) { //Failed to prepare the wave data buffer } //播放音频数据文件 if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0) { //Failed to write the wave data buffer } //关闭音频输出设备,释放内存 waveOutReset(hWaveOut)waveOutClose(hWaveOut)LocalUnlock(m_hFormat)LocalFree(m_hFormat)delete [] lpData用 Beep 函数。
BOOL WINAPI Beep(
__in DWORD dwFreq,
__in DWORD dwDuration
)
Beep( 发音频率,发音时间长度)
频率 0x25 到 0x7FFF
发音时间长度 -- 以毫秒计。
评论列表(0条)