Fensterprozeduren

Rückblick und Einführung

Die Funktion und die Deklaration einer Fensterprozedur ist ja bereits bekannt. Nun soll die Fensterprozedur mit Leben gefüllt werden, d.h. sie soll bestimmte Nachrichten abfangen und diese verarbeiten. Handelt es sich bei einer Fensterprozedur um die Fensterprozedur eines Hauptfensters, dann sollte sie sobald das Fenster geschlossen wird, das Programm beenden. Vergisst man diese Behandlung kann es vorkommen, dass sich das Programm nur noch mit der Windows-Notlösung (<Strg>+<Alt>+<Entf>) beenden lässt. Wird ein Fenster geschlossen (z.B. mit einem Klick auf  ), dann sendet Windows die Nachricht 'WM_CLOSE' an die Fensterprozedur. Allerdings sollte das Programm jetzt nicht einfach geschlossen werden, da mit dem Aufruf 'CreateWindow(...)' (bzw. 'CreateWindowEx(...)') Speicher reserviert wurde. Der Speicher sollte mit 'DestroyWindow(...)' wieder freigegeben werden:

BOOL DestroyWindow(HWND hWnd);

Die Parameter:

Parameter Erläuterung
hWnd - Fensterhandle des zu zerstörenden Fensters

Nach Aufruf dieser Funktion wird an das zu zerstörende Fenster wiederum eine Nachricht namens 'WM_DESTROY' geschickt. Es sollten also diese beiden Nachrichten auf jeden Fall abgefangen werden. Mit dem Aufruf der  Funktion 'PostQuitMessage(...)' wird die Nachricht 'WM_QUIT' gesendet, die wiederum 'GetMessage(...)' dazu veranlasst 'FALSE' zurückzugeben und somit die Nachrichtenschleife beendet. 

VOID PostQuitMessage(int nExitCode);

Die Parameter:

Parameter Erläuterung
nExitCode - dieser Wert wird als wParam mit der 'WM-QUIT'-Nachricht gesendet (meist 0)

Die Implementierung der Fensterprozedur

Die Deklaration der Fensterprozedur war wie folgt:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);

Um nun die Nachrichten einzeln behandeln zu können, wird bei der Implementierung der Fensterprozedur üblicherweise ein 'switch'-'case'-Block verwendet. Eine Alternative wäre ein mehrfach verschachtelter 'if'-'else'-Block. Die Behandlung der zuvor erwähnten Nachrichten könnte wie folgt implementiert werden:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
	switch (uiMessage)
	{
	case WM_CLOSE:
		DestroyWindow(hWnd);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		break;
	}
	return DefWindowProc(hWnd, uiMessage, wParam, lParam);
}

Die Nachrichten 'WM_CLOSE' und 'WM_DESTROY' werden wie bereits zuvor besprochen behandelt. Alle anderen Nachrichten werden an 'DefWindowProc(...)' weitergegeben und somit von Windows behandelt.

Zusammenfassung

Nun sind alle Elemente, die für ein Windowsprogramm mit minimaler Funktionalität vonnöten sind, erläutert worden. Vor allem das Nachrichtenkonzept von Windows sollte jetzt bekannt sein.

Die nächsten Lektionen

In der nächsten Lektion werden alle Elemente zu einer ersten lauffähigen Windows-Anwendung zusammengefasst, welche dann im Laufe weiterer Lektionen ausgebaut wird.

Zurück Nach oben Weiter