Drucken einer Form mit einem Scrollbaren Panel

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Drucken einer Form mit einem Scrollbaren Panel

    Hallo Forum,

    ich hab schon wieder eine Frage :(

    Ich habe gelesen, dass eine Form als solche nicht horizontal und vertikal scrollbar ist. Daher habe ich meine Objekte auf ein Panel gepackt.
    Dieses Panel steht auf Autoscroll, und ich möchte nun die gesamte Form in einer PDF-Datei drucken (Acrobat ist fest installiert)

    Ich habe mir das objekt Printform aus dem VB PowerPack auf die Form gezogen, in den Eigenschaften PrintToPrinter eingestellt und für einen Menü-Eintrag folgenden Code hinterlegt (aus MSDN):

    VB.NET-Quellcode

    1. PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)​

    Beim Drucken bekomme ich allerdings immer nur den gerade angezeigten Bereich der Form. Gibt es da eine Möglichkeit, das irgendwie zu steuern?

    Ich weiss nicht ob es hilf aber ich hab mal die Form als Datei angehängt....

    lg Micha
    Dateien
    • 32KO.Designer.vb

      (338,02 kB, 128 mal heruntergeladen, zuletzt: )
    • 32KO.vb

      (38,57 kB, 136 mal heruntergeladen, zuletzt: )

    Micha K schrieb:

    Gibt es da eine Möglichkeit, das irgendwie zu steuern?
    Du musst Dich um alles selbst kümmern. Gugst Du hier.
    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!

    doofi schrieb:

    wie spreche ich denn dort den Inhalt des Panel an?
    Da käme doch nur ein Screenshot raus.
    Überleg mal, das elegant zu lösen.
    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 gebs auf :( Ich hab jetzt so ziemlich alle Kombinationen mit printdokument und printform durch, google von vorne bis hinten gewälzt, und das Ergebnis: Laut Microsoft soll das Problemlos möglich sein, in der Praxis bekomm ich aber immer nur den gerade aktuellen Bildausschnitt hin.

    Zumindest hab ich jetzt mal alle Controls direkt auf die Form gepackt, ohne Panel. Das geht auch.

    Dann hab ich mir überlegt, dass ich bestimmt irgendwie den clientbereich (clipbounds oder visibleclipbounds??) verändern müsste für jede page.

    Vielleicht kann mir ja jemand mal beschreiben, welche Schritte ich durchführen sollte, mit meinen spröden VB6 Kenntnissen steh ich hier total auf dem Schlauch :(

    LG Micha

    Micha K schrieb:

    total auf dem Schlauch
    Warum willst Du die Form abmalen?
    Druck Dir Dein eigenes Dokument. Siehe der Link oben.
    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!
    Ja den Link hab ich gesehen und find das ja auch ganz toll.
    Nur meine Form lebt halt von der Anordnung der Textfelder im Zusammenhang, damit man den Spielverlauf veröffentlichen kann. Das muss doch gehen, das man sowas als Bitmap speichern kann :(

    Micha K schrieb:

    Ich habe gelesen, dass eine Form als solche nicht horizontal und vertikal scrollbar ist.


    form Autoscroll property?

    und das hier:

    "It looks like PrintOption.Scrollable is only going to work, if you have a scrollable form. You have a scrollable control here (probably a Panel), inside a form. In this case its area will not be expanded onto the printer."

    siehe auch die images im Anhang

    also es geht, nur evtl. nicht richtig gesucht
    Bilder
    • image 1.png

      31,21 kB, 765×435, 188 mal angesehen
    • image 2.png

      26,5 kB, 752×421, 211 mal angesehen
    • image 3.png

      71,59 kB, 1.440×549, 199 mal angesehen
    Na das ist doch mal ne Aussage... Würdest Du mir auch mitteilen, wo ich finden kann, wie das von statten geht? Mit der MSDN-Hilfe hats auf jeden Fall nicht geklappt... :(
    Wenn ich dich richtig verstanden habe, müsste es eigentlich so klappen, wie ich es in meinem Code gemacht habe,... tuts aber nicht :(

    VB.NET-Quellcode

    1. Private Sub mnuKOdrucken_Click(sender As System.Object, e As System.EventArgs) Handles mnuKOdrucken.Click
    2. PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)
    3. End Sub

    Micha K schrieb:

    tuts aber nicht
    Dann musst Du aufklären, was die

    Micha K schrieb:

    PowerPacks
    so machen.
    Ich hab so was nicht.
    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!
    Nach ewigem Suchen und Probieren muss ich mich leider noch mal melden.
    Ich habe noch keine brauchbare Lösung für das Problem gefunden, aber es muss dafür doch was geben....

    Mein Plan nochmal: Eine Form komplett (nicht mehr auszudrucken) als Bitmap abzuspeichern.
    Derzeit habe ich folgenden Code im Einsatz:

    VB.NET-Quellcode

    1. Private Sub DruckenToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles DruckenToolStripMenuItem.Click
    2. Dim Steuerelement As Control
    3. Steuerelement = Me ' Me entspricht Form
    4. Dim Breite As Integer = 1900 'Steuerelement.Width ' Breite des Steuerelements
    5. Dim Hoehe As Integer = 1200 'Steuerelement.Height ' Höhe des Steuerelements
    6. Dim Schnappschuss As Bitmap = New Bitmap(Breite, Hoehe) ' Größe der Bitmap
    7. ' ***** Schnappschuß machen als Bipmap *****
    8. Steuerelement.DrawToBitmap(Schnappschuss, Rectangle.FromLTRB(0, 0, Breite, Hoehe))
    9. My.Computer.Clipboard.SetImage(Schnappschuss) ' In die Zwischenablage
    10. ' ***** Falls in der Zwischenablage eine Bitmap vorliegt *****
    11. If System.Windows.Forms.Clipboard.GetDataObject() IsNot Nothing Then
    12. Dim Zwischenablage As IDataObject = System.Windows.Forms.Clipboard.GetDataObject()
    13. If Zwischenablage.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then
    14. Dim Bitmuster As System.Drawing.Image = _
    15. CType(Zwischenablage.GetData(DataFormats.Bitmap, True), Image)
    16. ' Als Bitmap speichern
    17. Bitmuster.Save("d:\MeinTest.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
    18. ' Als Jpg speichern
    19. Bitmuster.Save("d:\MeinTest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    20. ' Als Gif speichern
    21. Bitmuster.Save("d:\MeinTest.gif", System.Drawing.Imaging.ImageFormat.Gif)
    22. End If
    23. End If
    24. End Sub

    Der funktioniert auch soweit ganz gut, ich dachte jetzt, wenn ich den Bereich der Breite und Höhe der Form verändere, würde das gehen, aber dann erhalte ich nur das Bild im Anhang. Es fehlt da noch was, obwohl der Größenbereich stimmt...

    Würde mir da vielleicht jemand auf die Sprünge helfen?
    Bilder
    • MeinTest.jpg

      103,14 kB, 1.900×1.200, 204 mal angesehen

    Micha K schrieb:

    Es fehlt da noch was
    Meinst Du dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Steuerelement As Control
    3. Steuerelement = Me ' Me entspricht Form
    4. Dim Breite As Integer = Steuerelement.Width ' Breite des Steuerelements
    5. Dim Hoehe As Integer = Steuerelement.Height ' Höhe des Steuerelements
    6. Dim Schnappschuss As Bitmap = New Bitmap(Breite, Hoehe) ' Größe der Bitmap
    7. ' ***** Schnappschuß machen als Bipmap *****
    8. Steuerelement.DrawToBitmap(Schnappschuss, Rectangle.FromLTRB(0, 0, Breite, Hoehe))
    9. Clipboard.SetImage(Schnappschuss) ' In die Zwischenablage
    10. ' ***** Falls in der Zwischenablage eine Bitmap vorliegt *****
    11. If Clipboard.ContainsImage Then
    12. Dim img = Clipboard.GetImage()
    13. Dim bmp As New Bitmap(1900, 1080)
    14. Dim gr = Graphics.FromImage(bmp)
    15. gr.DrawImage(img, 0, 0, 1900, 1080)
    16. bmp.Save("d:\MeinTest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    17. Return
    18. End If
    19. 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!
    Hallo, danke!
    Jetzt wird zwar der Druckbereich komplett ausgefüllt, aber links rechts und unten fehlen immer noch Informationen... :(

    Ich hab auch zur Sicherheit den Bereich bei Dim Bmp und drawimage noch einmal vergrößert, aber immer noch keine komplette anzeige :(


    Anbei mal die betreffende Form dazu
    Bilder
    • MeinTest.jpg

      219,52 kB, 2.500×1.880, 188 mal angesehen
    Dateien
    • 16KO.Designer.vb

      (146,78 kB, 131 mal heruntergeladen, zuletzt: )
    • 16KO.vb

      (21,22 kB, 119 mal heruntergeladen, zuletzt: )

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

    Micha K schrieb:

    Anbei mal die betreffende Form dazu
    Kopier mal selbst Deine Dateien in ein neues Projekt und poste dann, was fehlt:

    VB.NET-Quellcode

    1. arrSpieler()
    2. Platzierung64()
    3. frmTabelle()

    Und:
    Es scheint, dass die Form beiter als der Bildschirm (1920 Pixel) ist.
    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!
    Hallo,


    Ich habe jetzt alle relevanten Daten in ein neues Projekt "test" kopiert. Was nicht benötigt wird, habe ich auskommentiert.
    Und ja, du hast recht, die Maße der Form können durchaus größer als die Bildschirmabmessungen sein. Die Anwendung wird daher auch immer im Vollbildmodus gestartet.
    Wenn das Projekt gestartet wird, kann man im Menü Turnier wählen... Doppel-Ko auswählen, dann kommt eine Form in der man dann 16er auswählt, und als nächstes ist die Spielerauswahl dran. doppelklick auf den Namen dann werden sie übernommen (es reichen die 10 die in der liste stehen) dann auf auslosen klicken, turniernamen eingeben und button turnier starten.

    Dann hat man das Bild, was ich gerne abgespeichert haben möchte...

    Hoffe das ist das was du haben wolltest ...
    Dateien
    • test.zip

      (50,82 kB, 125 mal heruntergeladen, zuletzt: )

    Micha K schrieb:

    was du haben wolltest ...
    Nicht ganz.
    Kannst Du da bitte mal ein sofort kompilierbares Projekt draus machen?
    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!

    Micha K schrieb:

    funktionieren
    Jetzt fehlt die Spieler-Datei.
    Und mach mal dies beim Auslesen:

    VB.NET-Quellcode

    1. For Each zeile As String In IO.File.ReadLines("DEINE_DATEI")
    2. ' was mit zeile tun
    3. Next
    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!
    Ohwei... da merkt man, das ich eigentlich nix kann :(

    Also die SpielerDB.txt hab ich jetzt als ressource dazugefügt. Sie wird beim installieren des Programms in einen Ordner "eigene dokumente/turniere/SpielerDB.txt" kopiert, daher läuft das wohl nicht beim debuggen. Der Pfad wird im Modul modStart als Publicvariable DatName gesetzt. Da wollte ich eigentlich direkt auf die Ressource zugreifen, hab das aber auch noch nicht hinbekommen. Ich habs nochmal gezippt, sie ist jetzt in den ressourcen drin. Das mit der For Each-Schleife schau ich mir mal an und bau es heut abend ein.
    Dateien
    • test1.zip

      (512,4 kB, 119 mal heruntergeladen, zuletzt: )