Frage zu MCI-Funktionen



  • Hallo!

    Ich hab mich mal mit dem FAQ-Beispiel "avi per mci" beschäftigt und hab dazu 3 Fragen.

    Für Spiele ist evtl noch interessant, dass man bei play auch den Parameter Fullscreen in den cmd-string setzen kann.

    Wo muss ich genau das Fullscreen hinsetzen? Hab mal etwas rumprobiert, aber das Video wird immer nur in Originalgrösse in der linken oberen Ecke abgespielt.

    Gibt es so etwas wie eine Zoomfunktion? Und wie kann ich das Videobild positionieren?



  • Ok, habs jetzt alleine rausgefunden (siehe unten).Hab jetzt noch ne Frage:
    Wie bekomme ich raus, dass ein Video zu Ende gespielt wurde, so dass ich ein neues abspielen oder anderen Kram machen kann?
    ----------------

    wsprintf(cmd, "put mympeg destination at 100 100 800 550"); 
      if (mciSendString(cmd, 0, 0, 0) != 0) 
      {  
        wsprintf(cmd, "MCI-Error: put"); 
        MessageBox(NULL, cmd, "Fehler", 0); 
        return -1; 
      }
      // stretcht in das angegebene rectangle
    
    wsprintf(cmd, "put mympeg destination"); 
      if (mciSendString(cmd, 0, 0, 0) != 0) 
      {  
        wsprintf(cmd, "MCI-Error: put"); 
        MessageBox(NULL, cmd, "Fehler", 0); 
        return -1; 
      }
      // stretcht auf das ganze Fenster.
    


  • Ok, hab ich jetzt auch raus gekriegt. Also, wenn man benachrichtigt werden will, wenn ein Video zu ende ist, macht man das so:

    wsprintf(cmd, "play mympeg from 0 notify"); //notify flag setzen
      if (loop) wsprintf(cmd, "%s repeat", cmd); 
      if (mciSendString(cmd, 0, 0, hWnd) !=0) // Fensterhandle 
      {  
        MessageBox(NULL, "MCI-Error: Kann Datei nicht absielen!", "Fehler", 0); 
        return -1; 
      }
    

    Durch das notify flag im command string bekommt man eine Window-Message MM_MCINOTIFY an das mit hWnd angegebene Fenster geschickt und kann darauf reagieren. Etwa so:

    // WindowProc
      switch(message) 
        { 
          case WM_CREATE:		    
    		myPlayAvi (hWnd, "1.mpeg", 0);
    		break; 
    	  case WM_DESTROY: 
    		myStopAvi();
            break;
    	  case MM_MCINOTIFY:
    		MessageBox(hWnd,"Ende!","Ende!",0);
    		break;
        }
    


  • Hab da noch ein Problem. Habe die beiden MCI-Funktionen aus dem FAQ-Beispiel nun in einen Screensaver gepackt und möchte nun, nachdem das eine Video zu ende ist, ein weiteres abspielen.

    long WINAPI ScreenSaverProc(HWND hWnd, 
                                UINT message, 
                                WPARAM wParam, 
                                LPARAM lParam) 
    { 
      switch(message) 
        { 
          case WM_CREATE:		    
    		myPlayAvi (hWnd, "1.mpeg", 0);
    		ShowCursor(FALSE);
    		break; 
    	  case WM_DESTROY: 
    		myStopAvi(MciWnd);
    		ShowCursor(TRUE);
    		MessageBox(MciWnd,"Test","Test",0);
            break;
    	  case MM_MCINOTIFY:
    		myStopAvi(MciWnd);
    		myPlayAvi (MciWnd, "2.mpeg", 0, hWnd);
    		break;
        } 
      return DefScreenSaverProc(hWnd,message,wParam,lParam); 
    }
    

    Die MM_MCINOTIFY-Message kommt auch an, aber der Screensaver wird dann (wohl durch myStopAvi?) sofort verlassen. Kann mir jemand erklären, warum das so ist oder wie man das sonst machen könnte?



  • Woher kommt MciWnd? und hast du es mal mit return 0 anstelle von break versucht?



  • Ups, sorry...

    Also, nachdem es im hWnd vom Screensaver so war, dass er beim Beenden des Videos auch den Screensaver beendet hat, habe ich mal versucht, ein Childfenster (MciWnd) zu erzeugen und das Video dort abzuspielen. Kam leider aufs Gleiche raus...

    Mit return 0; macht er auch das selbe. Es muss irgendwie an myStopAvi liegen, denn lasse ich es weg, wird der screensaver nicht beendet, alerdings kann ich auch kein neues Video abspielen, weil er ja das alte noch geöffnet hat...

    Hat jemand ne Idee?



  • Was genau machst du denn in myStopAvi und hat MciWnd ScreenSaverProc einen gültigen bzw. den richtigen Wert?


Log in to reply