Computer & Technik
Betriebssysteme
Windows
Fensterklasse
Anschließend erfolgt das Registrieren der Fensterklasse, was unbedingt gelingen muß. Kann die Klasse nicht registriert werden, muß das Programm abgebrochen werden!
Handelt es sich um die zweite oder weitere Instanz ist das Registrieren - wie gesagt - nicht mehr nötigt. Dann erfolgt sofort das Erzeugen des Anwendungsfenster. Auch dies geschieht meistens mit Standardwerten. Nach dem Erzeugen muß es angezeigt und gezeichnet werden. Die notwendigen Aufrufe lauten:
1. CreateWindow()
2. ShowWindow()
3. UpdateWindow()
Anschließend fällt das Programm in die Hauptschleife, die erst beim Beenden des Programms verlassen wird.
Soviel zur Grundstruktur eines WINDOWS-Programms. Jetzt folgen die Feinheiten - und die beginnen bei der Fensterfunktion. Nachdem beim Registrieren der Fensterklasse ein Zeiger auf eine Funktion übergeben wurde, sendet WINDOWS alle Nachrichten an eben diese Funktion. Die Parameter sind standardisiert und typisch für alle Funktionen, die von WINDOWS direkt aufgerufen werden.
FensterFunktion(Window : HWnd;
Message,
wParam : WORD;
lParam : LongInt) : LongInt; export;
In <Window> wird die Handle des betroffenen Fensters übergeben und in <Message> steht die aktuelle Meldung. Diese ist ein WORD-Wert, der anhand von Konstanten in einer CASE-Schleife ausgewertet wird. In <wParam> stehen weitere Informationen, die die Meldung näher spezifizieren. Dem gleichen Zweck dient auch <lParam>. Beiden Parametern ist gemein, daß sie nicht immer benötigt werden.
Der Rumpf einer Fenster-Funktion sieht demzufolge so aus:
FensterFunktion(Window, Message, wParam, lParam)
BEGIN
FensterFunktion := 0;
CASE Message OF
wm_Command : BEGIN
CASE wParam OF
END;
END;
wm_Destroy : BEGIN
PostQuitMessage(0);
EXIT;
END;
END;
END;
Die beiden genannten Meldungen sind in jeder WINDOWS-Applikation zu finden. wm_Destroy wird immer dann generiert, wenn das Programm beendet werden soll, während über wm_Command alle Ereignisse laufen, die über das Menü ausgelöst wurden. In wParam steht dann jeweils der Identifier des jeweiligen Menüpunktes.
Alle anderen Meldungen werden analog behandelt. Unser Beispielprogramm ASCII behandelt beispielsweise noch die Meldungen:
wm_paint - Fensterinhalt neu aufbauen
wm_size - Fenstergröße wurde verändert
wm_HScrll - horizontales Scrollen
wm_VScroll - vertikales Scrollen
Interessant ist dabei, daß bei den Scroll-Meldungen völlig unerheblich ist, ob sie durch die Tastatur oder die Maus ausgelöst wurden. Es kommt lediglich eine der folgenden Meldungen:
(( hier irgendwo Abbildung aus Petzold-Buch 3.9 unterbringen ))
SB_LINEDOWN - Zeile nach unten/rechts
SB_LINEUP - Zeile nach oben/links
SB_PAGEDOWN - Seite nach unten/rechts
SB_PAGEUP - Seite nach oben/links
SB_THUMTRACK - Bildlaufleistenfeld wurde bewegt
SB_THUMBPOSITION - Bildlaufleistenfeld auf neuer Position
Insbesondere SB_THUMBTRACK ist eine unangenehme Meldung, denn sie kann maschinengewehratrig auf das Programm eintrommeln. Wird jedesmal eine PAINT-Aktion ausgelöst, muß diese Routine extrem schnell sein, ansonsten bremst das Bildschirmupdate den Bildlauf.
Horizontales und vertikales Scrollen erzeugt im übrigen die gleichen Werte in wParam.