Fensterprozedur

Zurück Zum Inhaltsverzeichnis Weiter

Vervollständigen wir nun das Beispiel und fügen die noch fehlende Fensterprozedur hinzu.

no1b.gif (995 Byte) Festlegen der generellen Eigenschaften eines Fensters über die Fensterklasse.
no2b.gif (1016 Byte) Festlegen der individuellen Eigenschaften eines Fensters und Erstellung des Fensters.
no3b.gif (1017 Byte) Anzeigen des Fensters.
no4b.gif (1014 Byte) Schreiben der Nachrichtenschleife um die Nachrichten abzuholen und zu verteilen.
no5.gif (1008 Byte) Schreiben des Programmteiles zur Verarbeitung der Nachrichten. Dieser Programmteil wird auch als Fensterprozedur bezeichnet.

Wie Sie bereits mehrfach erfahren haben besitzt jede Fensterklasse eine Fensterprozedur in der die Nachrichten verarbeitet werden. Die Adresse der Fensterprozedur wird beim Aufruf der Funktion RegisterClassEx(...) angegeben. Daraus folgt folgende wichtige Erkenntnis:

Jede Fensterklasse besitzt eine eigene Fensterprozedur und alle Fenster einer Fensterklasse verwenden folglich die gleiche Fensterprozedur.

Kommen wir jetzt aber zum Wichtigsten, zur Verarbeitung einer Nachricht innerhalb der Fensterprozedur. Die Fensterprozedur erhält in einem Parameter die aktuell zu verarbeitende Nachricht übergeben, einschließlich ihrer beiden Zusatzinformationen. Um jetzt die Nachrichten zu verarbeiten, die für das Fenster relevant sind, werden die Nachrichten in einer switch-case Anweisung selektiert und dann entsprechend den Anforderungen durch die Anwendung verarbeitet. Alle für das Fenster nicht relevanten Nachrichten müssen wieder an WINDOWS zurückgegeben werden. Dies erfolgt durch den Aufruf der API-Funktion DefWindowProc(...). Die Fensterprozedur sollte, wenn Sie eine Nachricht selbst verarbeitet hat, den Wert '0L' zurückgeben. Wird eine Nachricht an die API-Funktion DefWindowProc(...) weitergegeben, so muss die Fensterprozedur den von dieser Funktion erhaltenen Rückgabewert zurückliefern.

Vervollständigen wir jetzt unser Beispiel. Bauen Sie in das Beispiel die Fensterprozedur ein. Da wir bis jetzt noch keine Nachrichten verarbeiten können, geben Sie alle eintreffenden Nachrichten an WINDOWS entsprechend weiter.

Übersetzen Sie das Beispiel dann. Sie sollten, wenn alles richtig eingegeben wurde, jetzt keine Fehlermeldungen mehr erhalten! Starten Sie nun das Programm bitte einmal, und nur einmal!

Lösung zur Fensterprozedur

// Konstanten
// ----------
// Fensterklassen-Name
....

// Funktionsprototyping!
// ---------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
                         WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(....)
{
    ....
}
// Die Fensterprozedur!
// --------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
                         WPARAM wParam, LPARAM lParam)
{
    // Alles durch WINDOWS bearbeiten lassen
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

Unsere erste Fensterprozedur verarbeitet noch keine Nachrichten, dies erfolgt erst ab der nächsten Lektion. Aus diesem Grund werden alle eintreffenden Nachrichten an die Funktion DefWindowProc(...) weitergegeben.

Haben Sie auch an das notwendige Funktionsprototyping gedacht?

Ende der Lösung

Das fertige Beispiel finden Sie übrigens unter 02EPOMFC\FirstWin im Programmverzeichnis zum Kurs.

Wenn Sie das Programm gestartet haben, so sollten Sie ein Fenster mit einem grauen Hintergrund erhalten. Außerdem sollte der Cursor, sobald er sich innerhalb des Fensters befindet, als nach oben gerichteter Pfeil erscheinen. Dieses Verhalten haben Sie beim Definieren der Fensterklasse vorhin ja schließlich festgelegt.

Schließen Sie nun das Fenster. So wie es den Anschein hat wurde die Anwendung damit auch beendet. Doch nicht alles ist so wie es scheint!

Drücken Sie jetzt einmal die Tasten <STRG>-<ALT>-<ENTF>, ja den berühmt berüchtigten Dreifingergriff. Sie werden dann (unter WINDOWS98) folgenden Dialog angezeigt bekommen:

Abbrechen einer Anwendung

In diesem Dialog werden alle noch laufenden Anwendung dargestellt. Und dazu gehört, welch Überraschung, auch unsere Anwendung FirstWin! Merken Sie sich daher denn folgenden wichtigen Satz:

Das Schließen eines Fensters beendet niemals automatisch auch die mit dem Fenster verbundene Anwendung!

Beim Anklicken des Schließsymbols des Fensters wurde diese zwar geschlossen, jedoch die Anwendung nicht beendet, d.h. wir haben zum Schluss eine Anwendung die kein Fenster mehr besitzt. Und eine solche Anwendung kann nur noch über den oben dargestellten Dialog 'abgeschossen' werden.

Klicken Sie jetzt im oben dargestellten Dialog den Eintrag Firstwin an und danach den Button Task beenden um die Anwendung zu beenden. Sie müssen diese Prozedur jedes Mal durchführen wenn Sie unser Beispiel erneut gestartet haben!

Ab der nächsten Lektion werden wir das Beispiel zu einer 'richtigen' WINDOWS Anwendung ausbauen und dann auch das Problem mit dem Beenden der Anwendung beseitigen.

Zurück Zum Inhaltsverzeichnis Weiter


Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470