Drucken von Steuerelementen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Dragonfly.

    Drucken von Steuerelementen

    Ich arbeite mich gerade in das drucken ein und habe auch soweit ausreichende Informationsquellen.
    Leider habe ich ein Problem damit bestimmte Steuerelemente welche ausgedruckt werden sollen mit GDI+ zu zeichnen.
    Was ja für das drucken erforderlich ist.

    Die betreffenden Steuerelemente sind alle auf einer Picturebox platziert.
    Daher arbeite ich jetzt in die Richtung dieses alles in eine Bitmap umgewandelt wird, welche dann entsprechend
    auch mit GDI+ gezeichnet werden kann.

    VB.NET-Quellcode

    1. Public Image As Bitmap = Picturebox.Image
    2. Private Sub printdoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles printdoc.PrintPage
    3. e.Graphics.DrawImage(Image, 0, 0, 100, 100)
    4. End Sub


    Das ganze haut bisher nur dann hin wenn ich dem Image eine Quelle aus My.Resources zuweise.
    Bei der Picturebox klappt die Wertübergabe noch nicht da mir gesagt wird das der Wert dann 0 ist.
    Ich bin mir auch nicht sicher in wie fern die auf der Picturebox platzierten Steuerelemente sowie die mit e.graphics in in die picturebox gezeichneten Sachen überhaupt das Image bilden ?


    Über einen Screenshot das ganze zu lösen habe ich auch schon versucht, das ganze ist auf Dauer aber keine Lösung da eben auch geöffnete Menüs usw. angezeigt werden.

    VB.NET-Quellcode

    1. Private Sub printdoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles printdoc.PrintPage
    2. Dim size As Size = New Size(Picturebox.Width, Picturebox.Height)
    3. e.Graphics.CopyFromScreen(10, 10, Picturebox.Width, Picturebox.Height, size)
    4. End Sub



    Ich hoffe mir kann jemand weiterhelfen, ich bin jetzt ehrlich seit Mittag nur noch am suchen und finde zu diesem
    speziellen Problem einfach nichts.

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Dragonfly“ ()

    Hi
    Ich versteh zwar nich ganz wie du die Form aufgebaut hast(bitte Screenshot oder so), Aber du könntest das so machen:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. '...
    3. <DllImport("gdi32.DLL", EntryPoint:="BitBlt", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    4. Private Shared Function BitBlt(ByVal Intptr1 As IntPtr, ByVal Left As Integer, ByVal Top As Integer, ByVal Width As Integer, ByVal Height As Integer, ByVal Intptr2 As IntPtr, _
    5. ByVal int1 As Integer, ByVal int2 As Integer, ByVal int3 As Integer) As Boolean
    6. End Function
    7. Private Function CreateImageFromGraphics(ByVal Graphics As Graphics, ByVal Bounds As Rectangle) As Image
    8. Dim graph As Graphics = Nothing
    9. Dim dc1 As IntPtr = IntPtr.Zero
    10. Dim dc2 As IntPtr = IntPtr.Zero
    11. Dim img As Bitmap
    12. img = New Bitmap(Bounds.Width, Bounds.Height, Graphics)
    13. graph = Graphics.FromImage(img)
    14. dc1 = Graphics.GetHdc()
    15. dc2 = graph.GetHdc()
    16. BitBlt(dc2, 0, 0, Bounds.Width, Bounds.Height, dc1, 0, 0, 13369376)
    17. Graphics.ReleaseHdc(dc1)
    18. graph.ReleaseHdc(dc2)
    19. Return CType(img, Image)
    20. End Function
    21. Public Function DrawControlToBitmap(ByVal Control As Control) As Bitmap
    22. Return CreateImageFromGraphics(Control.Graphics, New Rectangle(0, 0, Control.Width, Control.Height))
    23. End Function


    Was mir noch aufgefallen ist: Wozu machst du die Variable Image? Eigentlich bräuchtest du die doch gar nicht. Nimm doch einfach nur PictureBox.Image her.

    Die Bitmap kannst du dann ganz einfach zeichnen :)

    Gruß
    ~blaze~
    Danke für die Antwort ich werde mich da jetzt mal durcharbeiten. :)

    Dein Code hat glaube ich einen kleinen Fehler, wurde jedenfalls bei mir angezeigt.
    Da wo jetzt Object steht, stand Control.

    VB.NET-Quellcode

    1. Public Function DrawControlToBitmap(ByVal Control As Object) As Bitmap


    Hier noch ein Screenshot vom Programm:
    Das ganze Programm besteht aus einem Haufen von Textboxen die auf einer
    Picturebox angeordnet sind. Berechnungen und Speichern klappt schon ausgezeichnet und fehlerfrei.
    Ich muss jetzt eben nur noch das drucken hinbekommen...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dragonfly“ ()

    Ersetz mal die PictureBox durch container und dann mach:

    VB.NET-Quellcode

    1. Dim bmp As New Bitmap(Panel1.Width, Panel1.Height)
    2. Panel1.DrawToBitmap(bmp,New Rectangle(0,0,Panel1.Width,Panel1.Height))


    Is aber ungetestet... so wie das obere ^^

    ich lass immer die ByVals weg, die macht bei mir Visual Studio automatisch.

    Gruß
    ~blaze~
    Ne klappt leider nicht, aber dein erste Code läuft bis zu einer Stelle wo dann eine Fehlermeldung kommt.

    Der offentliche Member Graphics für den Typ PictureBox wurde nicht gefunden.
    Das passiert in der Function unten.

    VB.NET-Quellcode

    1. Public Function DrawControlToBitmap(ByVal Control As Control) As Bitmap
    2. Return CreateImageFromGraphics(Control.Graphics, New Rectangle(0, 0, Control.Width, Control.Height))
    3. End Function


    Ich arbeite so ja eigendlich schon mit Graphics wundert micht daher das diese Meldung kommt ?
    Also der Programmcode von dir läuft, gratuliere :thumbsup:
    Leider gibt es noch einen Harken er läuft für jedes beliebige Steuerelement auf der Form.
    Das heisst ich kann jetzt einzeln Buttons usw. drucken...
    Aber er läuft nicht für die Picturebox, hier wird zwar auch das gedruckt was ich haben möchte zusätzlich aber auch die ganzen Menüs und geöffneten Dialoge, halt als ob es ein Screenshot wäre...



    Das ganze wäre natürlich perfekt wenn man wirklich alles was man drucken möchte mit der picturebox in Verbindung bringt und diese dann eben in ein img umwandelt.
    Ich werde mich da noch ein bisschen reinhängen, zur Not müssen eben alle Steuerelemente die ich ausdrucken möchte über eine Schleife oder etwas in der Art hintereinander in das Image geschrieben werden.
    Vielen Dank für die Hilfe :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dragonfly“ ()