1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
' Déclaration des variables
Dim marge_physique_gauche As Integer
Dim marge_physique_haute As Integer
Dim dpiX As Integer
Dim dpiY As Integer
'API de lecture des capacités de l'imprimante
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal capIndex As Int32) As Int32
Private Const LOGPIXELSX As Integer = 88
Private Const LOGPIXELSY As Integer = 90
Private Const PHYSICALOFFSETX As Integer = 112
Private Const PHYSICALOFFSETY As Integer = 113
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
' Objectif: faire en sorte que ces marges corrigées, calculées
' avec les valeurs renvoyées par l'API Windows, soient les mêmes
' peu importe l'imprimante.
Try
'on récupere les marges physiques de l'imprimante
Dim hdc As IntPtr = e.Graphics.GetHdc
dpiX = GetDeviceCaps(hdc, LOGPIXELSX) 'résolution horizontale
dpiY = GetDeviceCaps(hdc, LOGPIXELSY) 'résolution verticale
marge_physique_gauche = CInt((GetDeviceCaps(hdc, PHYSICALOFFSETX)) / dpiX * 100)
marge_physique_haute = CInt((GetDeviceCaps(hdc, PHYSICALOFFSETY)) / dpiY * 100)
e.Graphics.ReleaseHdc(hdc)
Dim reference As Integer = 20
' Marge de référence qui, espérons-le, permet de corriger
' l'impression sur tout (valeur à ajuster en fonction des tests)
Dim tempX, tempY As Integer
If marge_physique_gauche < reference Then
tempX = marge_physique_gauche + (reference - marge_physique_gauche)
Else
tempX = reference
End If
If marge_physique_haute < reference Then
tempY = marge_physique_haute + (reference - marge_physique_haute)
Else
tempY = reference
End If
Dim rectangle As New Rectangle(tempX, tempY, 400, 80)
e.Graphics.FillRectangle(Brushes.Magenta, rectangle)
e.Graphics.DrawRectangle(Pens.Magenta, rectangle)
' Dessine un rectangle de couleur magenta dans le coin supérieur gauche de la feuille
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class |
Partager