Vorwort


Oftmals wird gefragt, wie man denn etwas ausdrucken könnte. Es scheint so, als ob damit eine gewisse Schwierigkeit verbunden wäre. Dem ist aber in Wirklichkeit gar nicht so. So wie man nämlich Text und Grafik auf der Fläche (Canvas) eines Fensters ausgeben kann, so kann man auch drucken. Der Drucker besitzt ebenfalls einen Gerätekontext (DC), auf dem man zeichnen kann. Man muss also nur den Gerätekontext des Druckers ermitteln und kann dann wie gewohnt seine Ausgabe machen. Das einzige, das man dabei berücksichtigen muss, ist, dass so ein Blatt Papier irgendwann auch zu Ende ist. Aber selbst das stellt eigentlich kein größeres Problem dar.

Will man also drucken, muss man folgende Aufgaben bewältigen:

  1. Ermitteln der Drucker und Auswahl des Druckers
  2. Ermitteln des Gerätekontextes des Druckers
  3. Aufbereiten des zu druckenden Textes (sofern man Text drucken möchte)
  4. Auf das Ende einer Seite reagieren und eine neue Seite beginnen

Wir wollen die Liste in diesem Kapitel Schritt für Schritt durchgehen, und am Ende sollten Sie in der Lage sein, einen mehrseitigen Text und einfache Grafikelemente auf dem Drucker auszugeben. Arbeitet man mit der VCL, dann steht einem die Unit "Printers.pas" zur Verfügung, die einem etwas Arbeit abnimmt. Ich habe an dieser Stelle bewusst auf sie verzichtet, weil ich zeigen will, was im Hintergrund passiert.

Zu diesem kleinen Tutorial gibt es natürlich auch ein kleines Beispielprogramm, dessen Bedienung recht einfach ist. Eine Combobox zeigt alle verfügbaren lokalen Drucker an, wobei der Standarddrucker immer vorausgewählt ist. Klickt man auf "Drucken", wird ein eineinhalbseitiger Platzhaltertext ("Lore Ipsum") ausgedruckt.


Struktur des GDI

Für die Zeichenroutinen unter Windows sind in erster Linie die Funktionen aus der "GDI32.dll" ("GDI.exe" unter Windows 98) zuständig. Sie übernimmt die übergeordnete Logik und überlässt den Treibern dann die eigentliche Ausführung. Zwischen GDI und Treibern findet dabei eine rege Kommunikation statt. Windows kann über den Treiber ermitteln, welche Operation das Gerät selbst ausführen kann, und bei welchen Fällen es Unterstützung in Form einer übergeordneten Logik braucht. Kann eine Grafikkarte beispielsweise selbst keine Linie von Punkt A nach Punkt B zeichnen, berechnet das GDI jeden einzelnen Pixel. Ist die Grafikkarte dazu fähig, bekommt sie nur die entsprechenden Befehlscodes und die Koordinaten.

Hauptziel des GDI ist es, möglichst geräteunabhängig zu sein. Das heißt, wenn die Treiber vorliegen, kann mit ein und der selben GDI-Funktion die Ausgabe sowohl auf dem Bildschirm, als auch auf einem Drucker oder einem Plotter erfolgen, ohne dass man dazu den Code ändern müsste. Mal abgesehen davon, dass man natürlich das Ziel der Zeichenoperation (Bildschirm, Drucker, Plotter, usw.) anpassen muss.

Die Ergebnisse sollten dann (fast) identisch aussehen. Und deswegen schrieb ich ja: Wenn man Text und Grafik auf der Fläche eines Fensters ausgeben kann, kann man auch drucken. Und genau darum geht es jetzt.