|

Win32 Programmierung mit FPC - Teil 7 - by Delax
So. Jetzt werden wir einfachen Text in unserem Fenster ausgeben. Ich sage bewußt "einfacher Text", da es zwei Möglichkeiten gibt in Windows Texte darzustellen (na gut, eigentlich mehr, aber vorerst stelle ich nur die 2 vor).
Die einfache Möglichkeit lautet TextOut. Das Beispiel, welches bei FPC beiliegt nutzt die Luxus Variante: DrawText. TextOut gibt einfach nur eine Zeile Text aus, wohingegen man bei DrawText eine Fläche für die Textausgabe definiert und Windows kümmert sich dann um Dinge wie Zeilenumbruch und Ähnliches.
Zuerst einmal TextOut. Um mit einem Fenster irgend etwas anzustellen benötigt man einen sogenannten Device Context. Auch genannt Graphics Device Context. Er steht in Zusammenhang mit der GDI. GDI steht für Graphics Device Interface, also die Schnittstelle zum Grafiksystem von Windows. Was immer ausgegeben wird läuft über die GDI. Die einzige Alternative liegt bei DirectX, welches aber noch weit außerhalb unserer bescheidenen Möglichkeiten liegt.
Den Device Context definieren wir ähnlich dem Windows Handle:
CONST
dcWindow : HDC;
Was fangen wir nun damit an und wann wird eigentlich der Text ausgegeben? Immer wenn Windows unser Fenster neu zeichnen will (zum Beispiel weil es vorher verdeckt oder minimiert war), wird die Nachricht "WM_PAINT" geschickt. Wenn wir also unseren Text immer dann ausgeben, wenn die Nachricht "WM_PAINT" unser Fenster erreicht, dann ist er auch immer zu sehen.
In unserer WinProc definieren wir zuerst einen neuen Fall für "WM_PAINT". Darin müssen wir als erstes den Device Context an unser Fenster binden. Schließlich muß Windows wissen, wohin wir eigentlich den Text ausgeben wollen. Das besorgt GetDC. Dazu müssen wir noch das Window Handle des Fensters angeben, in das wir zeichnen wollen.
dcWindow := GetDC(hWindow);
Alles, was wir nun mit dem Device Context anstellen, wird in unser Fenster ausgegeben. Als nächstes setzen wir Hintergrund- und Textfarbe fest.
SetBKMode(dcWindow, TRANSPARENT);
SetTextColor(dcWindow, RGB(0,0,0));
SetBKMode legt den Hintergrundmodus fest. Mit TRANSPARENT sorgt man dafür, das keine Texthintergundfarbe verwendet wird, sondern die in WinClass.hbrBackground angegebene Farbe. SetTextColor setzt die Textfarbe fest. Die Farbe wird durch das RGB System festgesetzt. Beachtet auch, das immer der Device Context des Fensters angegeben werden muß, um zu bestimmen auf was sich die Änderungen beziehen.
Kommen wir jetzt zum eigentlichen TextOut Befehl. Hier ein Prototyp.
TextOut(DeviceContext, X, Y, AusgabeString, Länge des Strings);
Wie schon bei der MessageBox, beachtet das Windows keine normalen Pascal Strings erwartet, sondern PChars! Windows läuft eben mit PChars, da es sich an C/ C++ orientiert. Nochmal zur Wiederholung: ein PChar ist eigentlich ein Null-terminierter Pointer auf einzelne Zeichen. FPC stellt sehr umfangreiche Möglichkeiten zum Umgang mit PChars in der Unit "Strings" bereit. Auch wenn es sich um PChars handelt verwende ich für eine Zeichenkette weiterhin den Begriff "String".
X und Y sind die Koordinaten des ersten Zeichens. Die Länge des Ausgabestrings muß als Integer Wert erfolgen und gibt die Anzahl der Zeichen des Strings an. Der Einfachheit halber kann man Lenght(String) nutzen. Nun als richtiges Beispiel.
TextOut(dcWindow, 15, 5, 'Textausgabe!', Length('Textausgabe!'));
Nun lösen wir den Device Context wieder von unserem Fenster.
Mehr wollen wir nicht ausgeben.
ReleaseDC(hWindow, dcWindow);
So. Das wars auch schon. Hier noch einmal komplett.
WM_PAINT:
begin
dcWindow := GetDC(hWindow);
SetBKMode(dcWindow, TRANSPARENT);
SetTextColor(dcWindow, RGB(0,0,0));
TextOut(dcWindow, 15, 5, 'Einfache Textausgabe!', Length('Einfache Textausgabe!'));
ReleaseDC(hWindow, dcWindow);
end;
Das komplette Beispiel hier als Download.
Dies ist nur eine einfache Form der Textausgabe. Im Grunde muß man sich dabei um alles selbst kümmern. In Windows gibt es jedoch fast immer eine Funktion, die einem die ganze Arbeit weitgehend abnimmt. In diesem Falle wäre das DrawText(). Das schauen wir uns im nächsten Teil an.
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|