(FAQ - WinAPI) avi per mci



  • Ich wollt das hier mal für die FAQ vorschlagen..

    Hab mal etwas rumgebastelt und nen mini-avi-player mit mci gebastelt.
    der kann nichts weiter als abspielen und anhalten, ist aber dafür schön einzubauen.

    zu includieren sind - wie in geeky's mp3-player die windows.h und mmsystem.h

    die Lib winmm.lib wird auch benötigt:

    int myPlayAvi (HWND hWnd, char *filename, int loop)
    {
     char cmd[300];
      wsprintf(cmd, "open \"%s\" alias mympeg type MPEGVideo style child", filename);
      if (mciSendString(cmd, 0, 0, 0) != 0)
      { 
        MessageBox(NULL, "MCI-Error: Kann Datei nicht öffnen!", "Fehler", 0);
        return -1;
      }
    
      wsprintf(cmd, "window mympeg handle %lu", hWnd);
      if (mciSendString(cmd, 0, 0, 0) != 0)
      { 
        wsprintf(cmd, "MCI-Error: Kann window handle %ld nicht setzen", hWnd);
        MessageBox(NULL, cmd, "Fehler", 0);
        return -1;
      }
    
      wsprintf(cmd, "play mympeg from 0");
      if (loop) wsprintf(cmd, "%s repeat", cmd);
      if (mciSendString(cmd, 0, 0, 0) != 0)
      { 
        MessageBox(NULL, "MCI-Error: Kann Datei nicht absielen!", "Fehler", 0);
        return -1;
      }
      return 0;
    }
    
    int myStopAvi (void)
    {
    char cmd[300];
      wsprintf(cmd, "close mympeg");
      if (mciSendString(cmd, 0, 0, 0) != 0)
      { 
        MessageBox(NULL, "MCI-Error: Kann Datei nicht schließen!", "Fehler", 0);
        return -1;
      }
      return 0;
    }
    

    Sämtliche Codecs, die installiert sind, kann er theoretisch abspielen - sogar mit sound 😉

    Als handle könnt ihr das Hauptfenster oder was auch immer eingeben. Für Spiele ist evtl noch interessant, dass man bei play auch den Parameter Fullscreen in den cmd-string setzen kann.

    Laut M$ funktioniert das unter Win ab 95, bzw. NT aufwärts.

    cYa
    DjR



  • ich habe mal ein kleine frage :}
    Was muss ich für HWND hWnd eintragen, denn mein Avi-File wird abgespielt,
    doch ich höre nur den Ton ... Bitte helft mir ich brauche das für Schulprojekt.



  • Du musst mit CreateWindow ein Fenster erstellen und dann das Fensterhandle (Rückgabewert) angeben 😉



  • ich steige da nicht so ganz durch 😕

    OpenDialog->Filter="AVI Files|*.avi;*.AVI";
    OpenDialog->Execute();
    
    HWND CreateWindow(
    
        LPCTSTR lpClassName,	// pointer to registered class name
        LPCTSTR lpWindowName,	// pointer to window name
        DWORD dwStyle,	// window style
        int 10,	// horizontal position of window
        int 10,	// vertical position of window
        int 310,	// window width
        int 310,	// window height
        HWND hWndParent,	// handle to parent or owner window
        HMENU hMenu,	// handle to menu or child-window identifier
        HANDLE hInstance,	// handle to application instance
        LPVOID lpParam 	// pointer to window-creation data
       );
    
    myPlayAvi (hWndParent, OpenDialog->FileName.c_str(), 0);
    

    Damit sollte ich ja ein Fenster erstellen, doch der Compiler meckert rum ...
    Von wegen das er nach ); ein ) erwartet ...
    Bitte hilf mir ich schnall das nicht so ganz...
    Den Hilfetext schnall ich nicht so ganz ...
    Zum hWndParent muss ich da vorher ein Handel erstellen und dann in dem aufruf auf das verweisen, wenn ja wie ?



  • mci man schrieb:

    Damit sollte ich ja ein Fenster erstellen, doch der Compiler meckert rum ...

    Ohne dir zu nahe treten zu wollen: Wenn du eine Funktionsdeklaration nicht von einem Aufruf unterscheiden kannst, solltest du die Komplexität deiner Projekte etwas runterschrauben und dich mit den Grundlagen befassen.



  • mci man:
    HWND ist ein Datentyp, keine Instanz.



  • ja tut mir leid, doch ich verstehe den Hilfe Text von BB nicht und
    wenn mir das keiner erklären möchte kann ich mich auch nicht weiterbilden.
    Also bitte klärt mich auf 🙄 ich stelle mich einfach dumm an ich weiß.
    Doch manchmal denke ich einfach etwas quär 🙂



  • Ist zwar nicht ganz korrekt allgemein gehalten, reicht aber um deinen misslungenen Funktionsaufruf von CreateWindow geradezubiegen:

    <Rückgabevariable> = <Funktionsname>(<Parameter_1>...<Paramter_n);



  • öhm wieso schreibt ihr immer so verschnörkelt ...
    Ich verstehe nicht so ganz wie ihr das meint.
    könnt ihr nicht einfach schreiben wie das geht und dann erklären ....

    <Rückgabevariable> <Funktionsname>(<Parameter_1>...<Paramter_n);

    kann ich nicht viel anfangen..traurig aber wahr..
    so sieht es momentan aus, doch ich verstehe nicht wieso er mit dem ; am ende der Funktion meckert 😞

    OpenDialog->Filter="AVI Files|*.avi;*.AVI";
    OpenDialog->Execute();
    
    HWND wind;
    
    wind CreateWindow (
        LPCTSTR lpClassName,	// pointer to registered class name
        LPCTSTR lpWindowName,	// pointer to window name
        DWORD dwStyle,	// window style
        10,	// horizontal position of window
        10,	// vertical position of window
        310,	// window width
        310,	// window height
        HWND hWndParent,	// handle to parent or owner window
        HMENU hMenu,	// handle to menu or child-window identifier
        HANDLE hInstance,	// handle to application instance
        LPVOID lpParam 	// pointer to window-creation data
        );
    
    myPlayAvi (wind, OpenDialog->FileName.c_str(), 0);
    

    bitte bitte sagt mir was ich wie genau ändern muss



  • <Rückgabevariable> = <Funktionsname>(<Parameter_1>...<Paramter_n);



  • Warum müssen eigentlich immer die ahnungslosesten mit solch größenwahnsinnigen Ideen wie "ich hab von C/C++ überhaupt keine Ahnung, also programmier ich mir mal mein eigenes Betriebssystem" daherkommen? 😮



  • JWolfram schrieb:

    Ist zwar nicht ganz korrekt allgemein gehalten, reicht aber um deinen misslungenen Funktionsaufruf von CreateWindow geradezubiegen:

    <Rückgabevariable> = <Funktionsname>(<Parameter_1>...<Paramter_n);

    -----------> = <-----------------

    Jetzt Verstanden was fehlt??

    Und, auch ich möchte dir nicht zu nahe tretten, aber
    BITTE BITTE fang mit Heel World an, Bitte!



  • @mci-man:

    dem Ratschlag zuerst Deine Grundlagenkenntnisse "etwas" auszubauen kann ich nur zustimmen, wenn es schon am Erstellen eines Fensters hapert.

    Guck Dir einfach mal dieses Open-Book an: http://pronix.de/modules/C/win32/

    Punkt 1.4 sollte Deinem Problem schon recht nahe kommen (ohne Dir jetzt zu nahe treten zu wollen 😉 )

    Gruß

    Michael



  • Ahhhhhhhhhhhhhhhh STOPP

    ich habe gerade erst gesehen das er über seinen Code "OpenDialog->..." stehen hat und den Filenamen mit der Subfunction .c_str übergiebt.
    Das ist VCL, sprich Borland, also hat er schon ein Fenster die Form (Form1).

    Na gut auch wenn ich das nicht gerne mache, aber damit du glücklich bist und
    dein AVI abspielen kannst:
    Dein Fenster Handle (HWND) ist Form1->Handle;

    Wenn du Programmieren lernen willst, hinterlege den BCB bei einer Bank für mind. 5 Jahre, ehr dürfen die ihn dir nicht wiedergeben und nehme z.B. DevCpp,
    der hat auch eine Art IDE, aber bleibt beim Stanard und nich mit einer in Pascal geschriebenen Lib für alles Sichtbare. (VCL = Visual Component Library).
    Lerne erst mal das einfache, bzw das erstellen eines Fensters ohne BCB zu starten und alle angaben irgendwo ein zu tragen.

    Die Vorgabe beim DevCpp hat Komentare die dir sagen was, was ist. Wenn du
    was Benutzt wo du per WinAPI Fenster erstellst etc. und nicht per Klick-Klick-Schieb-Borland, dann bist du hier richtig, sonst mußt du ins BCB Forum.


Log in to reply