Computer & Technik
Betriebssysteme
Windows
Dialoge
Bei einem Dialog handelt es sich im Prinzip um eine normale Fenster-Funktion, jedoch mit kleinen Unterschieden. Bevor ein Dialog abgearbeitet werden kann, müssen zwei Dinge geschehen:
- WINDOWS muß die Dialog-Beschreibung lesen
- die Adresse der Dialog-Funktion muß ermittelt werden
Letzteres ist notwendig, weil für WINDOWS ein Dialog nichts anderes als ein komplexes Fenster ist, das über eine Fenster-Funktion, eben der Dialog-Funktion verfügt. Erzeugt wird die Adresse über folgenden Aufruf:
Zeiger = MakeProcInstance(@Funktion, Instanz);
Anschließend wird der Dialog durchgeführt. Dazu dient die Funktion DialogBox, der vier Parameter übergeben werden:
1. Instanz
2. Bezeichner der Dialog-Beschreibung
3. Handle des aktuellen Fensters
4. Zeiger auf die Dialog-Funktion
WINDOWS sendet solange alle Nachrichten an die Dialog-Funktion, bis der Dialog beendet ist. Die Dialog-Funktion selbst ähnelt anderen Fenster-Funktionen. Analog zur Meldung WM_CREATE gibt es die Meldung WM_INITDIALOG. Beendet wird der Dialog über WM_COMMAND. Es folgt der Rücksprung zur aufrufenden Fenster-Funktion, wo der Speicher für den Funktions-Zeiger freigebenen wird. Anschließend geht alles seinen gewohnten Gang.
Grafik- und Textausgabe unter WINDOWS
Bereits diese Überschrift ist problematisch. WINDOWS unterscheidet nämlich nicht zwischen Text und Grafik. Auch ein normaler Text ist Grafik und benötigt einen Pen (Zeichenstift) und einen Font (klar, ohne Zeichensatz geht es nicht).
Pen und Font sind Objekte, für die zunächst ein Handle erzeugt werden muß. Dies geschieht über analoge Aufrufe:
NewFont := CreateFont();
NewPen := CreatePen();
Damit WINDOWS diese neuen Objekte auch wirklich annimmt, müssen sie bekanntgemacht werden. Dies erfolgt über die Funktion SelectObject:
OldObject := SelectObject(DC, NewObject);
Das Funktionsergebnis ist immer eine Handle auf das alte Objekt. DC ist eine Handle auf den Device-Kontext. Darunter versteht man unter WINDOWS eine Ausgabeeinheit, die üblicherweise zu Beginn der Meldung wm_Paint erzeugt wird:
DC := BeginnPaint(Window, PS);
Vor dem Verlassen der Schleife muß der DC auf jeden Fall mit ReleaseDC(Window, DC) wieder freigegeben werden. Ansonsten akumulieren sich im RAM die Speicherleichen, die WINDOWS irgendwann zum Herzinfarkt mit unvermeidlichem Exodus treiben.
PS ist eine Struktur, die Informationen über den neu zu zeichnenden Bereich bereitstellt. Geschicktes Auswerten von PS spart wertvolle Sekunden, denn meistens genügt es, nur einen kleinen Bereich neu zu zeichnen. Der Rest ist unverändert und kann entweder so bleiben, wie er ist, oder mit schnellen Funktionen kopiert werden.
Die eigentliche Ausgabe ist letztlich relativ einfach. Über den Aufruf GetClientRect(Window, R) werden die Koordinaten des Ausgabefensters bestimmt - dann kann gezeichnet werden.
Ein Wort jedoch zur Positionierung von Text. WINDOWS arbeitet mit proportionalen Fonts, die zudem von System zu System und von Grafikkarte zu Grafikkarte unterschiedlich ausfallen. Es sollte daher vermieden werden, absolute Koordinaten zu verwenden. Besser ist es, sich zunächst über GetTextMetrics(DC, NewFont) exakte Informationen über den aktiven Font zu holen und insbesondere die Zeilenvorschübe an der Zeichengröße auszurichten.
Zum Abschluß der Paint-Meldung müssen die erzeugten Objekte wieder freigegeben und alles so hinterlassen werden, wie es vorgefunden wurde. Insbesondere das ReleaseDC() darf nicht vergessen werden!
Damit wären wir mit unserer Rundreise durch die Welt von WINDOWS am Ende. Sicherlich haben wir nur die wichtigsten Aspekte kurz gestreift. Aber nach Studium des Sources der Beispielapplikation ASCII und der hier abgedruckten Referenz-Tabellen sollte jedem der Einstieg in Turbo-Pascal für WINDOWS leicht fallen.
Neben dem reinen Beispiel ist ASCII auch ein nützliches Tool. Denn WINDOWS arbeitet mit dem ANSI-Zeichensatz. Dieser unterscheidet sich vom gewohnten IBM- bzw. unter WINDOWS OEM-Zeichensatz. ASCII ist in der Lage beide Zeichensätze anzuzeigen und kann damit aus mancher Verlegenheit helfen. Denn auch die Menü- und Dialogtexte müssen im ANSI-Zeichensatz kodiert werden.