在vc的单文档应用程序中,我使用sndPlaySound函数播放一个背景音乐
( sndPlaySound("sound\\background.wav",SND_ASYNC); )。而在点击窗口的响应函数里用
sndPlaySound("sound\\click.wav",SND_ASYNC);播放另外一个音效文件。现在的问题是,当我点击窗口开始播放音效文件时,背景音乐就会停止播放了。
听闻多线程可以解决这个问题,但是我不知道如何实现,知道的各位请指点一下!!谢谢!!!
( sndPlaySound("sound\\background.wav",SND_ASYNC); )。而在点击窗口的响应函数里用
sndPlaySound("sound\\click.wav",SND_ASYNC);播放另外一个音效文件。现在的问题是,当我点击窗口开始播放音效文件时,背景音乐就会停止播放了。
听闻多线程可以解决这个问题,但是我不知道如何实现,知道的各位请指点一下!!谢谢!!!
{
srand((DWORD)time(NULL));
MCIDEVICEID dev[20]={0};
MCI_OPEN_PARMS mciOpen;
MCI_PLAY_PARMS mciPlay;
try
{
mciOpen.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_WAVEFORM_AUDIO;
mciOpen.lpstrElementName = (LPCSTR)pFileName;
mciOpen.wDeviceID = rand()%20 ;
if(mciSendCommand(NULL,MCI_OPEN, MCI_OPEN_ELEMENT,(DWORD_PTR)&mciOpen)!=0)
{
return 0 ;
}
mciPlay.dwFrom = 0;
mciPlay.dwTo = 100;
mciSendCommand(mciOpen.wDeviceID,MCI_PLAY,MCI_WAIT , (DWORD_PTR)(LPVOID)&mciPlay);
mciSendCommand(mciOpen.wDeviceID,MCI_CLOSE,NULL,(DWORD_PTR)(LPVOID)&mciPlay);
}
catch (...)
{ }
if(pFileName!=NULL)
delete pFileName;
return 0 ; }
//播放声音
void CMyDlg::PlayGameSound(LPCTSTR pszSoundName)
{
//创建动态指针,记得要删除
size_t size = (strlen(pszSoundName)+1)*sizeof(char);
char* pChar = (char*)malloc(size);
memset(pChar,0,size);
strcpy_s(pChar,size,pszSoundName);
CWinThread* pTh = ::AfxBeginThread(ThreadPlaySound,(LPVOID)pChar,0,0,NULL);
}
int m_iMusicTime =0;CString s="res\\1.mp3";
CFileFind fFind;
if(!fFind.FindFile(s))
{
KillTimer(ID_PLAYBGMUSIC);
return;
}
if(h_iMusicWnd) MCIWndDestroy(h_iMusicWnd);
h_iMusicWnd = MCIWndCreate(NULL,NULL,WS_MINIMIZE, s);
//SetMusicPower(Glb().m_iSound); //设置音量
m_iMusicTime = MCIWndGetLength(h_iMusicWnd);
SetTimer(ID_PLAYBGMUSIC,m_iMusicTime,NULL);//OnTimer内设置循环
MCIWndSetRepeat(h_iMusicWnd,TRUE);
MCIWndPlay(h_iMusicWnd);
本人刚刚做了个这方面的程序.顺便贴出来。
注:Header: Declared in Vfw.h.
Library: Use Vfw32.lib.