Drucken


Da wir nun den Gerätekontext des Druckers haben, können wir mit den bekannten GDI-Funktionen Grafiken und Text drucken. Weil es sich aber eben auch um einen Drucker handelt, der vom Druckerspooler gesteuert wird, sind noch ein paar zusätzliche API-Funktionsaufrufe nötig. Wir müssen einen so genannten "print job" (Druckauftrag) starten und dem Druckerspooler mitteilen, wann er eine neue Seite anfangen soll. Natürlich müssen wir den Druckauftrag auch beenden. Und erst wenn der Spooler das vollständige Dokument bekommen hat und der Druckauftrag beendet wurde, wird das Dokument an den Drucker geschickt und ausgedruckt.
Die API-Funktionen, die wir noch brauchen, sind:

Funktion Bedeutung
StartDoc beginnt einen Druckauftrag
EndDoc beendet einen Druckauftrag
EndPage schließt eine Seite ab und beginnt eine neue


Somit hätten wir jetzt das nötige Handwerkszeug zusammen.

Im konkreten Fall bleibt noch ein Problem: Der Fließtext muss in Zeilen umbrochen werden, die nicht breiter sind als unser Papier. Dabei hilft uns die Funktion GetTextExtentExPoint. Sie ermittelt, wie viele Zeichen in ein definiertes Rechteck passen. Und damit der Text nicht mitten im Wort umbrochen wird, gehen wir solange zurück, bis wir das erste Leerzeichen von hinten gefunden habe und schneiden dort unseren Text ab

GetTextExtentExPoint(dc, PChar(s), length(s), (PageW * 10) - (BORDERLEFT * 10) -
  (BORDERRIGHT * 10), @cntChars, nil, size);
while (s[cntChars] <> ' ') do
  Dec(cntChars);


Und das Ergebnis unserer Bemühungen sieht dann so aus: