Nachrichtenschleife im Dialog



  • Hi,

    Ich habe ein Dialoganwendung (MFC) und meine Frage ist jetzt wie ich an die
    Nachrichtenschleife rankommen kann. Per WinAPI kommt ja irgendwann ne Schleife
    á la :

    MSG msg = { 0 };
    
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
        }
        else
        {
            Render();
        }
    }
    

    Hm wie man schon sieht wollte ich halt wenn gerade keine Nachricht vorliegt
    mein Bild in den Dialog rendern, bisher mach ich das Rendern über Timer was
    mir aber nicht so gefällt. Man kann die Run() Funktion aus CWinApp überschreiben
    und dort diese Schleife "von hand" einsetzen, aber die Run() Funktion wird
    trotzdem ned aufgerufen, weiß auch nicht warum 😕

    ich weiß, wär eigentlich eher ein Thema fürs MFC Forum, aber da man allgemein für ne Windowsanwendung das Ganze warscheinlich sehr selten überschreiben würde hab ichs mal hier gepostet.

    Gruß
    paddy



  • aber die mfc leute könnten die wahrscheinlicher helfen als wir hier beim aushebeln 🙂

    ich glaube man konnte in dem *App.cpp irgendwie ein OnIdle einbinden mit dem man dann quasi ne hauptschleife simuliert.
    man kann auch einen timer starten der WM_TIMER messages alle 1ms schickt und das in OnTimer abfragen.

    rapso->greets(*move*);



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum MFC mit dem Visual C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi,

    Bei den MFC findet die Nachrichtenschleife "im Hintergrund" (genauer in den Klassen CWinApp und CWnd, von denen ja deine eigenen Klassen abgeleitet sind) statt.
    Es ist ja auch der Sinn und das Ziel der MFC den Programmierer möglichst weit von den ansonsten alltäglichen Dingen wie sich-um-die-Nachrichtenschleife-kümmern wegzubringen, denn das "Rad soll ja nicht jedesmal neu erfunden werden".
    Aber wie rapso bereits gesagt hat:
    OnIdle ist die richtige Anlaufstelle für dich. Google am besten einmal ein bisschen nach dieser Methode bzw. such im Forum, ob du was findest.
    Wenn du etwas Rendern willst, kannst du natürlich auch einen Timer verwenden (wie rapso auch schon angedeutet hat). Das kommt aber darauf an, ob du nur rendern will, wenn dein Programm im Leerlauf läuft.

    Grüße Raphael



  • Wenn du etwas Rendern willst dann ist es schon eher ein besseres Programm.

    Verwende also Threads dafür. Dazu sind sie da.
    Das erleichter auch später deine Anwendung SMP-Tauglich zu machen.



  • ich benutz jetz OnIdle, aber komischerweise wird diese Funktion nur aufgerufen wenn ich vorher den Windows Timer setze?!

    Versteht mich mit Rendern nicht falsch, ich mache nur einen kleinen 2D Shooter 😉



  • 2D Shooter bedeutet, dass in regelmäßigen Abständen gerendet werden muss.
    Verwende also, wie Unix-Tom gesagt hat, am besten Threads.
    Wenns etwas einfacher sein sollte (keine Synchronisierungsarbeit, etc), solltest du auf nen Timer zurückgreifen.


Anmelden zum Antworten