Drucken der Form

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Gottric.

    Drucken der Form

    Hey zusammen,

    ich möchte meine Form gerne ausdrucken. Genauso wie sie mir angezeigt wird.
    Mit printing habe ich aber keine Erfahrung. Von der Theorie her würde ich ne picturerbox machen, in der ein Screenshot gespeichert wird und dann diese ausdrucken. Meine Fragen sind:
    ist mein Weg zu umständlich?
    Wenn nicht, wie mache ich nen Screenshot nur von der from? Ich bekomm es nur hin vom ganzen Bildschirm in die picturebox.
    Oder bietet die printing Klasse von Haus aus die Möglichkeit nur die Form zu drucken?
    ohne Umwege über den Screenshot halt.

    Danke für eure antworten

    edit: ich könte ja auch Tastendrücke simulieren, wenn ich mich recht entsinne war das alt+Druck auf der Tastatur um nur das Fenster zu Screenshotten.
    also die Frage mit dem Screenshot nur von der Form Hat sich erledigt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gottric“ ()

    Erst einmal musst du ein Bild von deinem Control machen, am besten benutzt du dafür ein Panel

    VB.NET-Quellcode

    1. ​Dim bmp As New Bitmap(Panel1.Size.Width, Panel1.Size.Width)
    2. Panel1.DrawToBitmap(bmp, Panel1.ClientRectangle)


    Und nun musst du dieses Bild ausdrucken, schau mal hier, das kann dir weiter helfen:
    vbarchiv.net/tipps/tipp_1340-bild-ausdrucken-vbnet.html
    funktioniert soweit ganz gut, aber...

    wie bekomm ich hin dass er mir in der Seitenansicht das Baltt quer nimmt?
    Landscape ist das stichwort, ich weis, aber irgendwie klappt das nicht

    edit: anbei mein code

    VB.NET-Quellcode

    1. Dim oBitmap As Bitmap
    2. Dim WithEvents PrintDocument As New Printing.PrintDocument
    3. Dim PrintPreview As New PrintPreviewDialog
    4. Private Sub Button2_Click(ByVal sender As System.Object,
    5. ByVal e As System.EventArgs) Handles Button2.Click
    6. SendKeys.Send("%({PRTSC})")
    7. SendKeys.Flush()
    8. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    9. With PrintPreview
    10. .Document = PrintDocument
    11. .ShowDialog()
    12. End With
    13. End Sub
    14. Private Sub PrintDocument_PrintPage(ByVal sender As Object,
    15. ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
    16. Handles PrintDocument.PrintPage
    17. Dim gr As Graphics = e.Graphics
    18. gr.DrawImageUnscaled(oBitmap, e.MarginBounds.X, e.MarginBounds.Y)
    19. e.HasMorePages = False
    20. oBitmap.Dispose()
    21. End Sub
    22. End Class

    Gottric schrieb:

    Seitenansicht das Baltt quer
    machst Du so. Außerdem ziehst Du das PrintDocument im Designer auf die Form:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim oBitmap As Bitmap
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. SendKeys.Send("%({PRTSC})")
    5. SendKeys.Flush()
    6. System.Threading.Thread.Sleep(100) ' war bei mir erforderlich
    7. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    8. Me.PrintDocument1.DefaultPageSettings.Landscape = True ' Dies hier
    9. Using dlg = New PrintPreviewDialog
    10. dlg.Document = Me.PrintDocument1
    11. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    12. Return
    13. End If
    14. End Using
    15. End Sub
    16. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    17. Dim gr As Graphics = e.Graphics
    18. gr.DrawImageUnscaled(oBitmap, e.MarginBounds.X, e.MarginBounds.Y)
    19. 'e.HasMorePages = False ' nicht nötig
    20. oBitmap.Dispose()
    21. oBitmap = Nothing
    22. End Sub
    23. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die schnelle Antworten. Klasse Forum, Versuch ich sofort nach der Arbeit.

    Wenn ich das ganze, also den Screenshot speichern will geht das ohne Probleme. Aber über savefiledialog speichert er das nicht. Kopiert in die zwisghenablage wird es, hab ich in paint getestet.. Er greift aber nicht auf die Datei zu im savefiledialog. Poste nachher den Code den ich bis jetzt habe wenn ihr nur mit der Erklärung nicgt wisst was ich meine.
    Danke nochmal.

    Gottric schrieb:

    über savefiledialog speichert er das nicht
    Klappt doch:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. If Not Clipboard.ContainsImage Then
    3. Return
    4. End If
    5. Using dlg = New SaveFileDialog
    6. dlg.Filter = "PNG Images|*.png|All Files|*.*"
    7. dlg.DefaultExt = "png"
    8. If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
    9. Using oBitmap = CType(Clipboard.GetImage(), Bitmap)
    10. oBitmap.Save(dlg.FileName, Imaging.ImageFormat.Png)
    11. End Using
    12. End If
    13. End Using
    14. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    funktioniert alls sau gut, danke.
    ich hatte nen savefiledialog draufgezogen auf die form und den angesprochen, mir war nicht bewusst dass ich den auch so aufrufen kann.

    Gibt es auch ne möglichkeit das bild automatisch auf die mitte des blattes darzustellen?
    jetzt ist es quer wie ich wollte, aber leider immernoch zu groß. dachte es würde quer automatisch passen, tut es abe nicht. :)

    Gottric schrieb:

    automatisch
    Was gibt es denn für Alternativen zu Graphics.DrawImageUnscaled()?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Gottric schrieb:

    center
    musst Du selber berechnen.
    Probier mal dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim oBitmap As Bitmap
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. SendKeys.Send("%({PRTSC})")
    5. SendKeys.Flush()
    6. System.Threading.Thread.Sleep(100) ' war bei mir erforderlich
    7. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    8. Me.PrintDocument1.DefaultPageSettings.Landscape = Me.Height < Me.Width ' Dies hier
    9. Using dlg = New PrintPreviewDialog
    10. dlg.Document = Me.PrintDocument1
    11. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    12. Return
    13. End If
    14. End Using
    15. End Sub
    16. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    17. Dim gr As Graphics = e.Graphics
    18. Dim rc1 = e.MarginBounds
    19. Dim rc2 = New Rectangle(0, 0, oBitmap.Width, oBitmap.Height)
    20. Dim rc As RectangleF
    21. Dim d1 As Double = rc1.Width / rc2.Width
    22. Dim d2 As Double = rc1.Height / rc2.Height
    23. If d1 > d2 Then
    24. rc = New RectangleF(0.0F, 0.0F, CSng(rc2.Width * d2), CSng(rc2.Height * d2))
    25. rc.Offset(rc1.Left + (rc1.Width - rc.Width) / 2, rc1.Top)
    26. Else
    27. rc = New RectangleF(0.0F, 0.0F, CSng(rc2.Width * d1), CSng(rc2.Height * d1))
    28. rc.Offset(rc1.Left, rc1.Top + (rc1.Height - rc.Height) / 2)
    29. End If
    30. gr.DrawImage(oBitmap, rc)
    31. oBitmap.Dispose()
    32. oBitmap = Nothing
    33. End Sub
    34. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab ihn jetzt mal rüber kopiert, passt es in der MItte an, sehr gut. Die Abstände sich meiner Meinung nach bisschen groß, also in der Seitenansicht. die Ränder können kleiner sein.
    Und wenn ich jetzt auf drucken drücke kommt ein Fehler. Denke der ist mit absicht eingebaut.
    Ich versuch mal rauszufinden wo der liegt, danke.

    Gottric schrieb:

    Denke der ist mit absicht eingebaut.
    Jou. Allerdings von Dir selbst ;) .
    =====

    Gottric schrieb:

    die Ränder können kleiner sein.
    Die kannst Du mit MarginBounds einstellen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich komm da nicht weiter, ich hab die sache aufgegeben. ich hab ja jetzt ne funktion die mir nen screenshot speichert, dann muss man den halt öffnen und von dort auf drucken. ist ja auch kein abbruch.
    sobald ich meine Präroität in der Anwendung fertig habe (richtextboxen vergleichen und highlighten), dann versuch ich mich wieder am drucken. das andere hat jetzt erstmal vorrang für mich.
    aber vielen dank dafür.

    Gottric schrieb:

    aufgegeben
    Na na na.
    Die PrintDocument-Routine wird 2 Mal aufgerufen (Preview, Druck selbst), doch bereits beim 1. Mal zerstörst Du die Bitmap, die ist beim 2. Mal Nothing.
    Teste dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim oBitmap As Bitmap = Nothing
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. If oBitmap IsNot Nothing Then
    5. oBitmap.Dispose()
    6. End If
    7. SendKeys.Send("%({PRTSC})")
    8. SendKeys.Flush()
    9. System.Threading.Thread.Sleep(100) ' war bei mir erforderlich
    10. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    11. Me.PrintDocument1.DefaultPageSettings.Landscape = Me.Height < Me.Width
    12. Using dlg = New PrintPreviewDialog
    13. dlg.Document = Me.PrintDocument1
    14. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    15. Return
    16. End If
    17. End Using
    18. End Sub
    19. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    20. Dim gr As Graphics = e.Graphics
    21. Dim rc1 = e.MarginBounds
    22. Dim rc2 = New Rectangle(0, 0, oBitmap.Width, oBitmap.Height)
    23. Dim rc As RectangleF
    24. Dim d1 As Double = rc1.Width / rc2.Width
    25. Dim d2 As Double = rc1.Height / rc2.Height
    26. If d1 > d2 Then
    27. rc = New RectangleF(0.0F, 0.0F, CSng(rc2.Width * d2), CSng(rc2.Height * d2))
    28. rc.Offset(rc1.Left + (rc1.Width - rc.Width) / 2, rc1.Top)
    29. Else
    30. rc = New RectangleF(0.0F, 0.0F, CSng(rc2.Width * d1), CSng(rc2.Height * d1))
    31. rc.Offset(rc1.Left, rc1.Top + (rc1.Height - rc.Height) / 2)
    32. End If
    33. gr.DrawImage(oBitmap, rc)
    34. End Sub
    35. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hahahah, stimmt. ich idiot!!! versuch ich sofort.
    edit:

    funktioniert. also die ansicht. das mit dem ränder anpassen versuch ich jetzt mal. aber beim drucken kommt kein fehler mehr. kann es leider nicht testen jetzt. da meine patrone leer ist. aber so wie er mir das in der Form anzeigt sollte es ja auch ausgedruckt aussehen, deswegen ja "Druckvorschau" hahaha

    noch ne frage, das programm soll auf der arbeit laufen, ich kenn den genauen namen des druckes jetzt nicht auswendig, ist einer von vielen. Wenn ich nichts angebe, auf welchen drucker greift er dann zu?
    den bei mir im Büro, den beim Chef? so wie ich gelsesn habe greift er immer auf den letzt benutzen zu, oder hab ich da was falsch verstanden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gottric“ ()

    Gottric schrieb:

    da meine patrone leer ist
    Nimm nen PDF-Drucker, der hat nicht mal nen Netzstecker. :D
    =================

    Gottric schrieb:

    auf welchen drucker greift er dann zu?
    Gib dem PrintDocument den Druckernamen fest mit, bevor Du den Preview-Dialog aufrufst.

    VB.NET-Quellcode

    1. ' gleich noch den Duckernamen vorgeben
    2. Me.PrintDocument1.PrinterSettings.PrinterName = "Foxit PhantomPDF Printer"
    Achtung. Beim falschen Namen gibt es ne entsprechende Exception.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()