在vc的单文档应用程序中,我使用sndPlaySound函数播放一个背景音乐
( sndPlaySound("sound\\background.wav",SND_ASYNC); )。而在点击窗口的响应函数里用
sndPlaySound("sound\\click.wav",SND_ASYNC);播放另外一个音效文件。现在的问题是,当我点击窗口开始播放音效文件时,背景音乐就会停止播放了。
听闻多线程可以解决这个问题,但是我不知道如何实现,知道的各位请指点一下!!谢谢!!!

解决方案 »

  1.   

    UINT  CMyDlg::ThreadPlaySound(LPVOID pFileName)
    {
    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);
     
    }
      

  2.   

    你UI上的每个button都对应了一个功能是吧,那么你可以在button中创建一个线程,把你实现的这部分功能放在线程函数中执行就好了。
      

  3.   

    具体创建线程方法,如果你用的是微软的编译器用CreateThread就好了,具体请参见MSDN
      

  4.   

    HWND h_iMusicWnd = 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.