Nachrichtenschleife

Zurück Zum Inhaltsverzeichnis Weiter

Da wir nun das Fenster erstellt und auch dargestellt haben können wir an das Verarbeiten der Nachrichten gehen.

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.
no4.gif (1014 Byte) Schreiben der Nachrichtenschleife um die Nachrichten abzuholen und zu verteilen.
no5b.gif (1008 Byte) Schreiben des Programmteiles zur Verarbeitung der Nachrichten. Dieser Programmteil wird auch als Fensterprozedur bezeichnet.

Die Nachrichten an alle Fenster einer Anwendung werden im Regelfall zunächst in der so genannten Nachrichtenschleife eingesammelt. Unabhängig von der Anzahl der Fenster innerhalb einer Anwendung gibt es (in der Regel) eine Nachrichtenschleife. Wie die Nachrichten dann letztendlich an die einzelnen Fenster weiter verteilt werden erfahren Sie gleich. Die Nachrichtenschleife hat folgenden minimalen Aufbau:

while (GetMessage(&Message, NULL, 0,0))
{
    TranslateMessage(&Message);
    DispatchMessage(&Message);
}

Die Funktion GetMessage(...) wurde schon im Kapitel Einführung in WINDOWS beschrieben. Sie wartet auf das Eintreffen einer Nachricht und holt diese dann aus der Nachrichtenschlange ab. Wie Sie vielleicht noch wissen, liefert GetMessage(...) solange einen Wert ungleich 0 zurück, solange keine WM_QUIT Nachricht empfangen wurde. D.h. die Nachrichtenschleife wird erst dann verlassen, wenn auf irgend eine Art und Weise eine WM_QUIT Nachricht in die Nachrichtenschlange abgelegt wurde.

Sehen wir uns nun den 'Inhalt' der Nachrichtenschleife an. Als erste Funktion innerhalb der Nachrichtenschleife wird die API-Funktion TranslateMessage(...) aufgerufen. Diese Funktion ist dafür verantwortlich, dass die virtuelle Tastencodes in ASCII-Codes übersetzt werden. Was virtuelle Tastencodes sind wird später bei der Behandlung von Tastatur-Ereignissen noch ausführlich erklärt.

Die nächste Funktion DispatchMessage(...) ist dafür zuständig, dass die Nachrichten an die im Anschluss an diese Lektion beschriebene Fensterprozedur verteilt wird. Vielleicht erinnern Sie sich noch: jedes Fenster gehört zu einer Fensterklasse, und jede Fensterklasse besitzt eine Fensterprozedur deren Adresse bei der Registrierung der Fensterklasse mittels RegisterClassEx(...) spezifiziert wurde. Besitzt die Anwendung mehrere Fenster die unterschiedlichen Fensterklassen angehören, so wird über DispatchMessage(...) die Nachricht an die Fensterprozedur weitergeleitet, zu der das Empfangsfenster gehört.

Und wieder erweitern wir uns Beispiel. Bauen Sie nun in das Beispiel die Nachrichtenschleife ein.

Übersetzen Sie das Beispiel wieder. Die Fehlermeldung, dass WndProc nicht definiert ist werden Sie immer noch erhalten.

Lösung zu Nachrichtenschleife


    // Fenster darstellen
    // ------------------
    ShowWindow(hWindow, nCmdShow);
    // Nachrichten-Schleife
    // --------------------
    MSG strMessage;    // Nachrichten-Struktur definieren
    // Auf Nachricht warten
    while (GetMessage(&strMessage,NULL,0,0))
    {
        // Tastencode uebersetzen
        TranslateMessage(&strMessage);
        // Nachricht an Fensterprozedur verteilen
        DispatchMessage(&strMessage);
    }

    return 0;
}

Für die Erstellung der Nachrichtenschleife definieren wir uns zunächst die notwendige Nachrichtenstruktur strMessage. Diese Struktur wird an die Funktion GetMessage(...) übergeben. Der Aufruf von GetMessage(...) führt nun dazu, dass die Anwendung solange inaktiv bleibt bis eine Nachricht für sie eintrifft. Trifft eine Nachricht ein so kehrt die GetMessage(...) wieder zurück und die Nachricht in strMessage wird zuerst an die Funktion TranslateMessage(...) weitergegeben um so eventuelle virtuelle Zeichencodes in ASCII-Codes zu übersetzen. Anschließend wird durch Aufruf von DispatchMessage(...) die Nachricht an die im nächsten Schritt zu erstellende Fensterprozedur übergeben.

Die Nachrichtenschleife wird dann beendet, wenn GetMessage(...) den Wert 0 zurückliefert was dann der Fall ist, wenn eine WM_QUIT Nachricht ausgelesen wurde.

Ende der Lösung

Damit ist die Funktion WinMain(...) komplett und wir können endlich ans Definieren der Fensterprozedur gehen.

 
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