Drei Messages für ein und dasselbe?



  • Ich habe drei Messagetypen zum Beenden eines Fensters gefunden:

    WM_CLOSE
    WM_DESTROY
    WM_QUIT
    

    Ich habe schon die MSDN konsultiert, aber die beschreibt die Nachrichten nur grob und erklärt nicht, was die feinen Unterschiede sind. Und welche Nachricht wird verschickt, wenn der X-Button geklickt wird?



  • Wenn du das Fenster mit dem X schließt, wird WM_CLOSE gesendet, bei DestroyWindow() bekommst du unter anderem ein WM_DESTROY. Diese WM_QUIT Nachricht bekommst du nach einem PostQuitMessage().


  • Mod

    WM_QUIT erhält kein Fenster mehr, weil die Nachrichtenloop damit terminiert wird...



  • .......... schrieb:

    Ich habe drei Messagetypen zum Beenden eines Fensters gefunden:

    WM_CLOSE
    WM_DESTROY
    WM_QUIT
    

    Ich habe schon die MSDN konsultiert, aber die beschreibt die Nachrichten nur grob und erklärt nicht, was die feinen Unterschiede sind. Und welche Nachricht wird verschickt, wenn der X-Button geklickt wird?

    WM_CLOSE wird verschickt bevor das Fenster geschlossen wird. Hier hast Du noch eine Chance, das Schließen zu unterbinden. WM_DESTROY wird verschickt nachdem das Fenster geschlossen wurde. Das steht aber so im MSDN.

    mfg Martin



  • Verstehe.

    WM_CLOSE wird also gesendet, wenn das Fenster geschlossen werden soll (vom Anwender gewünscht). Hier hat man die Möglichkeit, dem noch entgegenzuwirken oder eine Abfrage auf ein Dirty-Flag auszuführen.

    WM_DESTROY wird gesendet, wenn das Fenster geschlossen wurde. Man kann nichts mehr dagegen machen, und Funktionen wie DestroyWindow senden diese Message (die Schließung des Fensters wurde intern vom Programm erzwungen und der Anwender kann diese Nachricht nicht senden).

    WM_QUIT hat überhaupt nichts mit dem Schließen eines Fensters an sich zu tun. Wenn WM_QUIT gesendet wird (warum auch immer), wird die Messageloop sofort geendet (die Funktion, die für das Abarbeiten der Nachrichten verantwortlich ist, wird nicht einmal mehr aufgerufen). Ein schwerwiegender Fehler oder eine Ausnahme könnte hiermit markiert werden.

    Richtig?



  • .......... schrieb:

    WM_QUIT hat überhaupt nichts mit dem Schließen eines Fensters an sich zu tun. Wenn WM_QUIT gesendet wird (warum auch immer), wird die Messageloop sofort geendet (die Funktion, die für das Abarbeiten der Nachrichten verantwortlich ist, wird nicht einmal mehr aufgerufen). Ein schwerwiegender Fehler oder eine Ausnahme könnte hiermit markiert werden.

    Richtig?

    Grundsätzlich ja. Deine Anwendung sollte aber PostQuitMessage() aufrufen und damit implizit WM_QUIT senden, wenn das letzte Fenster WM_DESTROY erhalten hat. Daher würd ich jetzt nicht "überhaupt nichts" schreiben, aber das ist eher Korinthenkackerei.

    mfg Martin


Anmelden zum Antworten