GDI+ Gezeichnetes drucken - mehrseitig

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

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

    GDI+ Gezeichnetes drucken - mehrseitig

    Leute ich bins mal wieder und habe mal wieder eine Frage:
    Ich hab jetzt anhand eines Tutorials auf dieser Seite es geschafft einen Text, Rechtecke und Linien auf ein PrintDocument zu bekommen.
    Ich bin dabei VB besser kennenzulernen und möchte nun eine Art Playliste drucken für meinen Mediaplayer.
    Die Daten dafür habe ich in einer Listview. Die Items und Subitems auslesen schaff ich schon jedoch hab ich ein Problem:
    Wenn ich jetzt ca 30 Lieder in meiner Playliste habe, dann druckt mir das PrintDocument nur eine Seite.

    Derzeit habe ich eine For Schleife um das ganze Prozedere überhaupt zu verstehen (den Integer (i) lass ich mir derzeit dazu ausgeben um zu sehen welche Zeile das gerade ist:

    VB.Net Quellcode

    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. e.Graphics.DrawString("Jahr", New Font("arial", 12), Brushes.Black, New Point(75, 160))
    3. e.Graphics.DrawRectangle(Pens.Black, 125, 160, 315, 25)
    4. e.Graphics.FillRectangle(Brushes.Black, 125, 160, 315, 25)
    5. e.Graphics.DrawString("Titel", New Font("arial", 12), Brushes.White, New Point(125, 160))
    6. e.Graphics.DrawRectangle(Pens.Silver, 125, 185, 315, 25)
    7. e.Graphics.FillRectangle(Brushes.Silver, 125, 185, 315, 25)
    8. e.Graphics.DrawString("Interpret", New Font("arial", 12), Brushes.Black, New Point(125, 185))
    9. e.Graphics.DrawLine(Pens.Black, 75, 220, 750, 220)
    10. For i As Integer = 0 To 30
    11. e.Graphics.DrawString("Jahr", New Font("arial", 12), Brushes.Black, New Point(75, posy))
    12. e.Graphics.DrawRectangle(Pens.Black, 125, posy, 315, 25)
    13. e.Graphics.FillRectangle(Brushes.Black, 125, posy, 315, 25)
    14. e.Graphics.DrawString("Titel " & i, New Font("arial", 12), Brushes.White, New Point(125, posy))
    15. e.Graphics.DrawRectangle(Pens.Silver, 125, posy + 25, 315, 25)
    16. e.Graphics.FillRectangle(Brushes.Silver, 125, posy + 25, 315, 25)
    17. e.Graphics.DrawString("Interpret " & i, New Font("arial", 12), Brushes.Black, New Point(125, posy + 25))
    18. e.Graphics.DrawLine(Pens.Black, 75, posy + 60, 750, posy + 60)
    19. posy += 70
    20. Next
    21. End Sub


    Posy wird am Anfang auf 230 gesetzt
    Derzeit schau ich mir das Resultat auf eine PrintPreviewDialog an welchen ich mit einem Button aufrufe, Resultat: ich komme nur bis Zeile 13
    Mit index weiterschalten hab ich hier auch schon was gefunden, geht auch schon in die richtige Richtung, doch ich weiß nicht wie ich das umsetzen soll, deswegen hab ichs vorerst wieder aus dem Programm rausgenommen.
    Screenshot ist im Anhang.
    Hoffe ich hab alles gut erklärt und einer von euch genialen Genies kann mir weiterhelfen. Danke :D

    Edit 22:03: Problem selber gefunden auf dieser Seite, Danke an @Dodo, welcher dies schon einmal einem anderen User erklärt hat. Habe den Code:
    VB.Net Quellcode

    VB.NET-Quellcode

    1. Select Case Seite
    2. Case 1: '1 Seite
    3. For Listview Item 1 bis 12
    4. Next
    5. HasMorePages = True
    6. Seite = 2 ' Zähler auf Seite 2 setzten
    7. Case 2: ' 2 Seite
    8. For ListView 13 bis 24
    9. Next
    10. HasMorePages = True
    11. Seite = 3 ' Seite 3 Setzten
    12. Case 3: ' Seite 3
    13. For ListView 25 - 36
    14. Next
    15. HasMorePages = False
    16. End Select

    für mein Programm anpassen und verwenden können.
    Bilder
    • Screenshot Druckdatei.png

      23,88 kB, 1.366×768, 105 mal angesehen

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

    @Pat Rick Gugst Du zunächst hier, da wird detailliert beschrieben, wie ein langes Textdokument gedruckt wird.
    Sicher ist eine Tabelle in diesem Sinne etwas anderes, aber Du musst Dich ebenfalls rantasten, bis wohin die aktuelle Seite geht, um dann zu wissen, wann der PageBreak gesetzt werden muss.
    In diesem Sinne ist die starre For-Schleife suboptimal, denn wenn Du den Druck-Font in seiner Größe veränderst, stehst Du wieder vor demselben Problem.
    Also:
    Ausmessen, wie hoch die aktuelle Zeile ist, achte dabei auf den Zeilenüberlauf, und dann eine dynamische Schleife programmieren, der die Schriftgröße egal 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!
    @RodFromGermany:
    Danke für den Input, durch den Teil 1 deines Tutorials hab ich überhaupt mal was zum laufen gebracht ^^ .
    Eigentlich ist das Programm für mich nur zum ausprobieren, da reicht mir schon wenn die Font gleich bleibt, mir ist es sogar lieber, wenn ich immer nach gleichem Muster einen Druck habe. ;) Wenn ich mal wieder mehr Zeit habe (Ferien) dann werde ich mir den 2. Teil aber auch noch ansehen, dachte das würde nur mit Textboxen gehen, aber gut wenn ich jetzt weiß, dass man alles auch mit GDI+ gezeichneten umsetzen kann. :D

    Pat Rick schrieb:

    da reicht mir schon wenn die Font gleich bleibt
    Es ist schon sinnvoll, solch Code allgemein vorrätig zu haben. Wenn Du irgendwann eine andere Tabelle drucken willst, solltest Du das ohne eine Zeile neuen Codes tun können. :D
    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!