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