Hallo,
ich möchte eine Windows-Form vernüftig ausdrucken. Habe mit Google hierfür mehere Tipps dazu gefunden, die aber immer auf das selbe hinauslaufen:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
End Sub
Private Const SRCCOPY As Integer = &HCC0020
Private Declare Function BitBlt _
Lib "gdi32.dll" ( _
ByVal hdcDest As IntPtr, _
ByVal x As Int32, _
ByVal y As Int32, _
ByVal Width As Int32, _
ByVal Height As Int32, _
ByVal hdcSrc As IntPtr, _
ByVal xSrc As Int32, _
ByVal ySrc As Int32, _
ByVal dwRop As Int32 _
) As Boolean
Private formImage As Bitmap
Public Sub PrintForm()
' Gibt eine Bildschirmkopie einer am Bildschirm komplett
' sichtbaren Form auf dem Drucker aus (Screenshot).
' Platzieren Sie diesen Code im Form-Klassenmodul der
' Form, die Sie ausdrucken möchten.
' Zunächst: Bildschirmkopie der Form erzeugen.
' Nachteil: Verdeckte und anderweitig nicht sichtbare
' Teile(der) WinForm werden nicht mit in die Grafik
' aufgenommen.
' Graphics-Objekt für die Form erzeugen
Dim formGraphics As Graphics = Me.CreateGraphics
' Kompatible Bitmap erzeugen und Graphics-Objekt abholen
formImage = New Bitmap(Me.Width, Me.Height, formGraphics)
Dim memGraphics As Graphics = Graphics.FromImage(formImage)
' Quell- und Ziel-DCs abholen
Dim sourceDC As IntPtr = formGraphics.GetHdc
Dim targetDC As IntPtr = memGraphics.GetHdc
' Kopieren ("Screenshot")
BitBlt(targetDC, _
0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, _
sourceDC, _
Me.ClientRectangle.X, Me.ClientRectangle.Y, _
SRCCOPY)
' Alternative Variante folgend auskommentiert:
' Mit dem folgenden Code wird die gesamte Form (inkl. Rändern
' und Titelzeile) in die Ziel-Bitmap kopiert:
' BitBlt(targetDC, _
' 0, 0, Me.Size.Width, Me.Size.Height, _
' sourceDC, _
' 0, 0, _
' SRCCOPY)
' DCs freigeben
formGraphics.ReleaseHdc(sourceDC)
formGraphics.Dispose()
memGraphics.ReleaseHdc(targetDC)
memGraphics.Dispose()
' In formImage steht die Abbildung der Form nun zur Verfügung.
' Die Abbildung aus formImage ausdrucken:
PrintDocument1.Print()
formGraphics.Dispose()
End Sub
Private Sub PrintDocument1_PrintPage( _
ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs _
) Handles PrintDocument1.PrintPage
' Screenshot ausdrucken
e.Graphics.DrawImage(formImage, 0, 0)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Me.PrintForm()
End Sub
End Class Das Funktioniert auch, jedoch schmiert der Drucker doch schon extrem dabei was nicht gerade schön anzusehen ist. Ich denke das liegt daran, das das Image was erzeugt wird gezoomt wird und nicht die Originalgrößen hat. Habe das Problem mit den schmieren aber egal ob ich die Form Maximiert starte oder Normal.
Weiß jemand wie das besser bzw ohne schmieren geht?
Pdt |