|
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
|