2016-07-09 5 views
0

Я пытаюсь воспроизвести mp3-песню за другим из списка, проблема в том, что команда «wait» «заморозит» всю программу до тех пор, пока все песни не закончатся, и что Я хочу, чтобы другие функции, такие как «пауза» или «остановка», продолжали работать во время воспроизведения песни. У меня нет проблем, когда я играю одну песню по отдельности.mciSendString, что-то похожее на команду «wait»

Я прочитал некоторую документацию, и это выглядит так, что команда «статус» является решением, но я не понимаю, как ее использовать.

Вот код «дела IDC_Play:»

if ((SendDlgItemMessage(hDlg, IDC_CHECK1, BM_GETSTATE, NULL, NULL)) == BST_CHECKED) 
{//here goes the code for play only one song} 

else { 
    int cuenta = SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETCOUNT, NULL, NULL); 
    int indice = 0; 
    while (indice != cuenta) { 
     char auxi[10] = ""; 
     UINT index = SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETCURSEL, 0); 
     SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETTEXT, index, (LPARAM)auxi); 
     if (strcmp(auxi, "") == 0) { 
      MessageBox(NULL, "No se selecciono cancion", "ERROR", MB_ICONERROR); 
     } 
     else { 
      char Cnum[10]; 
      aux = inicio; 
      aux = aux->sig; 
      do { 
       _itoa_s(aux->folio, Cnum, 10); 
       if (strcmp(auxi, Cnum) == 0) { 
        strcpy_s(szFileName, aux->mptres); 
        bmp1 = (HBITMAP)SendDlgItemMessage(hDlg, IDC_Imagen1, STM_GETIMAGE, IMAGE_BITMAP, 0); 
        bmp2 = (HBITMAP)LoadImage(NULL, aux->imagen, IMAGE_BITMAP, 140, 120, LR_LOADFROMFILE); 
        SendDlgItemMessage(hDlg, IDC_Imagen1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp2); 
        } 
       else { 
        aux = aux->sig; 
       } 
      } while (strcmp(auxi, Cnum) == -1 || strcmp(auxi, Cnum) == 1); 

      ShowWindow(GetDlgItem(hDlg, IDC_Play1), SW_HIDE); 
      ShowWindow(GetDlgItem(hDlg, IDC_Pause1), SW_SHOW); 

      char comillas[MAX_PATH] = "\""; 
      char comillas2[MAX_PATH] = "\""; 
      strcat_s(comillas, szFileName); 
      strcat_s(comillas, comillas2); 
      char musica[MAX_PATH] = "open "; 
      strcat_s(musica, comillas); 
      strcat_s(musica, " type mpegvideo"); 
      mciSendString(musica, NULL, 0, 0); 
      char musica1[MAX_PATH] = "play "; 
      char esperar[MAX_PATH] = " wait"; 
      strcat_s(musica1, comillas); 
      strcat_s(musica1, esperar); 
      mciSendString(musica1, NULL, 0, 0); 
      char parar[MAX_PATH] = "stop "; 
      strcat_s(parar, comillas); 
      mciSendString(parar, NULL, 0, 0); 
      char cerrar[MAX_PATH] = "close "; 
      strcat_s(cerrar, comillas); 
      mciSendString(cerrar, NULL, 0, 0); 

      index++; 
      SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETCURSEL, index, NULL); 
      SendDlgItemMessage(hDlg, IDC_LIST2, LB_SETCURSEL, index, NULL); 
      SendDlgItemMessage(hDlg, IDC_LIST3, LB_SETCURSEL, index, NULL); 
      SendDlgItemMessage(hDlg, IDC_LIST4, LB_SETCURSEL, index, NULL); 
      SendDlgItemMessage(hDlg, IDC_LIST5, LB_SETCURSEL, index, NULL); 

      indice = index; 
     } //else 
    } //while 
}//else 
+0

Там нет никакой магии происходит. Если вызов блокируется, он блокируется. Вам нужно понять, как работают приложения Windows. Получите себе копию Чарльза Петцольда [Программирование Windows®] (https://www.amazon.com/dp/157231995X). – IInspectable

ответ

0

Может быть, вы должны использовать MM_MCINOTIFY флаг и обратного вызова, чтобы избежать блокировки вызова, которая замораживает все приложение?

Пожалуйста, смотрите пример использования обратного вызова и флаг там на CodeProject: http://www.codeproject.com/Articles/17279/Using-mciSendString-to-play-media-files

 Смежные вопросы

  • Нет связанных вопросов^_^