| ||||||||||||||||||||||||||||
|
|
|
|
Hatte das vorherige Beispiel noch den 'kleinen' Fehler, dass beim Schließen des Fensters die Anwendung nicht beendet wurde, so werden wir dies jetzt korrigieren.
Nach dem das Fenster geschlossen wurde, sendet WINDOWS eine WM_DESTROY Nachricht an die Fensterprozedur des Fenster. Die Zusatzinformationen zur Nachricht haben folgende Bedeutung:
WM_DESTROY Nachricht |
|
| WPARAM wParam | keine Bedeutung |
| LPARAM lParam | keine Bedeutung |
Beim Eintreffen dieser Nachricht muss nun irgendwie erreicht werden, dass die Nachrichtenschleife in der Funktion WinMain(...) verlassen und damit das Programm beendet wird. Wie Sie sich bestimmt noch erinnern, holt die Nachrichtenschleife mit 'while ( GetMessage(...) )' die Nachrichten aus der Nachrichtenschlange. Und GetMessage(...) liefert als Returnwert den Wert 0 wenn eine WM_QUIT Nachricht ausgelesen wurde. Um nun eine WM_QUIT Nachricht in die Nachrichtenschlange abzulegen wird die Funktion PostQuitMessage(...) aufgerufen.
| Öffnen Sie nun zunächst das Ausgangsprojekt 02EPOMFC\WndPraxis
im Programmverzeichnis zum Kurs. Anschließend erweitern Sie die Fensterprozedur um die
Verarbeitung der WM_DESTROY Nachricht so, dass beim Eintreffen dieser Nachricht das
Programm korrekt beendet wird. Übersetzen und starten Sie das Beispiel dann. Wenn Sie alles richtig gemacht haben sollte beim Schließen des Fensters auch die Anwendung beendet werden. Sie können dies nachprüfen, in dem Sie nach dem Beenden den berühmten Dreifingergriff ausführen. In dem darauf eingeblendeten Dialog sollte die Anwendung Wndpraxis nicht mehr aufgeführt sein.
|
Erweitern wir das Beispiel noch um eine zusätzliche Funktionalität. In vielen Fällen ist es erforderlich, noch vor dem Schließen des Fenster einige Aktionen durchzuführen. Denken Sie z.B. an einen Editor der vor dem Schließen des Fensters nachfragen muss, ob die geänderten Daten gesichert werden sollen. Um dies zu erreichen wird die Nachricht WM_CLOSE innerhalb der Fensterprozedur verarbeitet. Die Zusatzinformationen zur Nachricht haben folgende Bedeutung:
WM_CLOSE Nachricht |
|
| WPARAM wParam | keine Bedeutung |
| LPARAM lParam | keine Bedeutung |
WINDOWS versendet diese Nachricht bevor das Fenster geschlossen wird. Die Standard-Fensterprozedur ruft als Reaktion auf diese Nachricht die Funktion DestroyWindow(...) auf.
| Wenn diese Nachricht in der Fensterprozedur verarbeitet wird und das Fenster soll geschlossen werden, so muss die Anwendung die Funktion DestroyWindow(...) selbst aufrufen. Soll dagegen der Schließvorgang abgebrochen werden, so ist keine weitere Aktion notwendig. |
| Fügen Sie jetzt ihrem Beispiel eine Abfrage hinzu die vom Anwender nach
dem Einleiten des Schließvorgangs zusätzlich nochmals abfragt, ob das Fensters auch
tatsächlich geschlossen werden soll. Wird diese Abfrage bejaht, so ist das Fenster zu
schließen und damit auch die Anwendung zu beenden. Wird die Abfrage dagegen
verneint so soll das Fenster selbstverständlich weiterhin geöffnet
bleiben. Übersetzen und starten Sie das Beispiel dann.
Wie reagiert Ihre Anwendung, wenn Sie im WM_DESTROY Zweig den Aufruf von PostQuitMessage(...) entfernen? |
Im nächsten Schritt werden wir uns mit dem prinzipiellen Darstellen von Fensterinhalten befassen.
|
|
|
|
|
|