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