Programmieren mit C++

Borland C++

Drucken

Drucken in Landscape

Wie kann mit BC++ unter Verwendung der OWL und speziell des TPrinter-Objekts Drucken in Landscape realisiert werden?

Frage

Das Drucken mittels OWL in Landscape erfordert 8 Schritte:

  • TPrinter-Objekt definieren
  • DEVMODE-Struktur ermitteln
  • DEVMODE-Struktur ändern
  • Drucker-Profil ermitteln
  • DC für den Drucker erzeugen
  • TPrintDC erzeugen
  • Druckausgaben vornehmen
  • Aufräumarbeiten/Rücksetzungen

Im folgenden werden alle Schritte erläutert, wobei der Druck dieses Beispielsprogramms der Einfachheit halber über die rechte Maustaste angestoßen wird.

Zunächst wird ein TPrinter-Objekt deklariert:

Lösung

void TDrawWindow::EvRButtonDown(uint,TPoint&)
{
static char szPrinter[80];
char *szDevice, *szDriver, *szOutput;
HDC dc;
 
// printer objekt deklarieren
TPrinter Printer;

Anschließend kann die DEVMODE-Struktur ermittelt werden:

TPrinter-Objekt deklarieren

DEVMODE *dm = const_cast  
           (Printer.GetSetup().GetDevMode());

Zum Drucken im Landscape-Modus müssen die Felder dmOrientation und dmFields angesprochen werden:

DEVMODE-Struktur ermitteln

dm->dmOrientation = DMORIENT_LANDSCAPE;
dm->dmFields |= DM_ORIENTATION;

Der folgende Code ermittelt den aktuellen Druckeranschluß:

DEVMODE-Struktur ändern

GetProfileString("windows","device",",,,",
                 szPrinter,80);
szDevice = strtok(szPrinter,",");
szDriver = strtok(NULL,",");
szOutput = strtok(NULL,",");

Anhand der nun vorliegenden Informationen über den aktuellen Drucker kann ein Ausgabekontext für den Drucker erzeugt werden:

Drucker-Profil ermitteln

if(szDevice && szDriver && szOutput)
{
 dc = CreateDC(szDriver, szDevice,
               szOutput, dm);
}

Mit Hilfe des nun vorliegenden Drucker-DCs wird im folgenden ein TPrintDC erzeugt, damit für alle Druckausgaben die Methoden des TPrintDC-Objekts verwendet werden können:

DC für den Drucker erzeugen

TPrintDC PrintDC(dc);

Nach diesen Vorarbeiten kann über das eben erzeugte TPrintDC-Objekt in gewohnter Weise gedruckt werden:

PrintDC erzeugen

PrintDC.StartDoc("PrintJob",NULL);
PrintDC.StartPage();
PrintDC.TextOut(10,10,"Landscape?");
PrintDC.EndPage();
PrintDC.EndDoc();

Nach Abschluß des Druckvorgangs muß der zuvor erzeugte Ausgabekontext zerstört werden:

Druckausgaben

DeleteDC(dc);

Erweiterungen der vorgestellten Lösung

Die hier aufgezeigte Lösung stellt lediglich eine Basisversion dar, deren primäre Aufgabe darin bestand, die prinzipielle Vorgehensweise aufzuzeigen. So wurde beispielsweise auf eine Fehlerabfrage verzichtet, was für seriöse Anwendungen aber selbstverständlich sein sollte.

Ferner bietet es sich an, die bestehenden Einstellungen der Struktur DEVMODE zwischenzuspeichern und am Ende wieder zu restaurieren, damit die globalen Druckereinstellungen nach dem Beenden des Programms für den Anwender unverändert sind.

Beispielprogramm

Das komplette Programm der Beispiellösung ist auf der Begleit-CD enthalten.

Aufräumarbeiten

Wie können die physikalischen Dimensionen einer Druckseite in TWIPS über ein TPrintDC-Objekt ermittelt werden?

Frage

Dazu müssen zunächst die Dimensionen in mm ermittelt werden, was über

GetDeviceCaps(HORIZSIZE); // horizontal
GetDeviceCaps(VERTSIZE);  // vertikal 

Die so ermittelten Dimensionen können durch Verwendung der nachfolgenden Umrechenbeziehung nach TWIPS konvertiert werden:

1 TWIP = 1/1440 inch ~ 0.18 mm (1 inch - 254 mm)

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 01:55:32 von textarchiv.alojado.de