Bei den meisten Druckern für Einzelblattverarbeitung ist es nicht möglich, mit den Anweisungen Printer.CurrentX = 0 und Printer.CurrentY = 0 die aktuelle Druckposition wirklich an den linken, oberen Papierrand zu setzen. Nach einer solchen Positionierung befindet sich die aktuelle Druckposition bei den meisten Druckern einige Millimeter vom linken und oberen Papierrand entfernt.
Wird z.B. ein linker Rand von 20 mm gewünscht, so ergäbe Printer.CurrentX = 20 (bei Einstellung Printer.ScaleMode = vbMillimeters) eine tatsächliche Randbreite von vielleicht 26 Millimeter. Bei der Festlegung der Druckposition durch Printer.CurrentX und Printer.CurrentY sind die für den jeweiligen Drucker geltenden physikalischen Ränder mit zu berücksichtigen. Für einen Drucker HP4P gilt z.B. ein phys. linker Rand mit 6,35 Millimeter.
Um einen tatsächlichen linken Rand von 20 Millimetern zu erreichen, muss die Anweisung also Printer.CurrentX = 20 - 6.35 lauten.
Mit der API-Funktion
GetDeviceCaps
können bei 32-Bit Systemen (Windows95 / 98 u. Windows NT / 2000) die physikalischen Druckerränder ermittelt werden:
'Im Deklarationsteil:
Private Const PHYSICALOFFSETX As Long = 112
Private Const PHYSICALOFFSETY As Long = 113
Private Declare Function GetDeviceCaps Lib "GDI32" ( _
ByVal hDC As Long, ByVal nIndex As Long) As Long
'Im Programmteil:
With Printer
LRand = .ScaleX(GetDeviceCaps(.hDC, PHYSICALOFFSETX), vbPixels)
ORand = .ScaleY(GetDeviceCaps(.hDC, PHYSICALOFFSETY), vbPixels)
RRand = .ScaleX(.Width, vbTwips) - .ScaleWidth - LRand
URand = .ScaleY(.Height, vbTwips) - .ScaleHeight - ORand
End With
Man beachte, dass Printer.ScaleMode die Einheit der Rückgabewerte bestimmt. Sollen z.B. alle Angaben in Millimeter erfolgen, so muss vorher einfach folgende Zeile stehen:
Printer.ScaleMode = vbMillimeters
Ursprünglicher Artikel von
Peter Götz (Götz GmbH)