Drucker: Erweiterte Informationen ermitteln
Veröffentlicht: 03. Aug 2001 | Aktualisiert: 13. Jun 2004
Von Mathias Schiffer
Bedingt durch Mechanismen zum Papiertransport lassen handelsübliche Drucker nicht zu, ein Blatt Papier komplett zu bedrucken. Es bleiben damit meist Ränder an allen vier Kanten notwendigerweise unbedruckt. Das Printer-Objekt von Visual Basic gibt Ihnen über diese physikalisch bedingten Ränder aber keinerlei Aufschluß. Auch über die aktuelle Auflösung des Druckers vermag das Objekt nichts zu verraten.
Mit der API-Funktion GetDeviceCaps und einigen zugehörigen Konstanten können Sie diese Informationen jedoch – entweder direkt, oder indirekt – ermitteln:
Private Declare Function GetDeviceCaps _ Lib "gdi32" ( _ ByVal hdc As Long, _ ByVal nIndex As Long _ ) As Long Private Const HORZRES As Long = 8& Private Const VERTRES As Long = 10& Private Const LOGPIXELSX As Long = 88& Private Const LOGPIXELSY As Long = 90& Private Const PHYSICALWIDTH As Long = 110& Private Const PHYSICALHEIGHT As Long = 111& Private Const PHYSICALOFFSETX As Long = 112& Private Const PHYSICALOFFSETY As Long = 113&
Die folgenden Routinen helfen Ihnen bei der Ermittlung der vermissten Informationen in der für das API üblichen Einheit Pixel. Im herunterladbaren Beispielprojekt finden Sie außerdem Routinen, die die Umrechnung in andere Einheiten erlauben, ohne – wie die Funktionen ScaleX und ScaleY des Printer-Objekts – einen Druckauftrag zu initiieren. Weiterhin stellt Ihnen diese Klassenlösung die entsprechenden Werte für den aktuellen Drucker entsprechend dessen aktueller ScaleMode-Eigenschaft zur Verfügung.
' Ermittlung der gesamten Höhe der Druckseite ' (inkl. unbedruckbarem Bereich): Private Function PaperHeight() As Long PaperHeight = GetDeviceCaps(Printer.hdc, PHYSICALHEIGHT) End Function ' Ermittlung der gesamten Breite der Druckseite ' (inkl. unbedruckbarem Bereich): Private Function PaperWidth() As Long PaperWidth = GetDeviceCaps(Printer.hdc, PHYSICALWIDTH) End Function ' Ermittlung der bedruckbaren Höhe der Druckseite: Private Function PrintableHeight() As Long PrintableHeight = GetDeviceCaps(Printer.hdc, VERTRES) End Function ' Ermittlung der bedruckbaren Breite der Druckseite: Private Function PrintableWidth() As Long PrintableWidth = GetDeviceCaps(Printer.hdc, HORZRES) End Function ' Ermittlung des oberen physikalischen (nicht bedruckbaren) ' Randes einer Druckseite in Pixeln: Private Function OffsetTop() As Long OffsetTop = GetDeviceCaps(Printer.hdc, PHYSICALOFFSETY) End Function ' Ermittlung des linken physikalischen (nicht bedruckbaren) ' Randes einer Druckseite in Pixeln: Private Function OffsetLeft() As Long OffsetLeft = GetDeviceCaps(Printer.hdc, PHYSICALOFFSETX) End Function ' Ermittlung des unteren physikalischen (nicht bedruckbaren) ' Randes einer Druckseite in Pixeln: Private Function OffsetBottom() As Long ' Der untere physikalische Rand ergibt sich aus der physikalischen Seitenhöhe ' abzüglich der bedruckbaren Höhe abzüglich des oberen Rands: With Printer OffsetBottom = GetDeviceCaps(.hdc, PHYSICALHEIGHT) - _ GetDeviceCaps(.hdc, VERTRES) - _ GetDeviceCaps(.hdc, PHYSICALOFFSETY) End With End Function ' Ermittlung des rechten physikalischen (nicht bedruckbaren) ' Randes einer Druckseite in Pixeln: Private Function OffsetRight() As Long ' Der rechte physikalische Rand ergibt sich aus der physikalischen Seitenbreite ' abzüglich der bedruckbaren Breite abzüglich des linken Rands: With Printer OffsetRight = GetDeviceCaps(.hdc, PHYSICALWIDTH) - _ GetDeviceCaps(.hdc, HORZRES) - _ GetDeviceCaps(.hdc, PHYSICALOFFSETX) End With End Function ' Horizontale Auflösung in DPI ermitteln: Private Function DPIX() As Long DPIX = GetDeviceCaps(Printer.hdc, LOGPIXELSX) End Function ' Vertikale Auflösung in DPI ermitteln: Private Function DPIY() As Long DPIY = GetDeviceCaps(Printer.hdc, LOGPIXELSY) End Function
Beispielprojekt