Form Druck - e.Graphics Größe anpassen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von michl75.

    Form Druck - e.Graphics Größe anpassen

    Hallo,

    habe mich durch viele Seiten gekämpft... bin kein Spezialist für e.Graphics...

    Möchte eine Form drucken, was soweit auch funktioniert... nur wird das immer so "doof" abgeschnitten und kämpfe jetzt schon einige Stunden damit rum und wollte euch nach eurer Meinung fragen...

    Meine Vorgabe war, dass jedes Form druckbar sein soll und das egal wie Groß diese Form ist. Je nach Größe soll Form "verkleinert" werden und auf einer A4 ausgedruckt werden können.

    Mein Code bisher:

    VB.NET-Quellcode

    1. Dim memoryImage As Bitmap
    2. Private Sub DruckenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DruckenToolStripMenuItem.Click
    3. CaptureScreen()
    4. With PrintPreviewDialog1
    5. .Document = PrintDocument1
    6. .ShowDialog()
    7. End With
    8. End Sub
    9. Private Sub CaptureScreen()
    10. Dim myGraphics As Graphics = Me.CreateGraphics()
    11. Dim s As Size = Me.Size
    12. memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
    13. Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
    14. memoryGraphics.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, s)
    15. End Sub
    16. Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    17. Dim srcRect As New RectangleF(0, 0, e.MarginBounds.X, e.MarginBounds.Y)
    18. e.Graphics.DrawImage(memoryImage, 0, 0, srcRect, GraphicsUnit.Inch)
    19. End Sub


    Anbei noch ein Bild ... wo es abgeschnitten wird und ich weis einfach ned warum.

    Mit ist auch klar, wenn man es an die Größe von A4 anpasst, dass der Ausdruck "gequetscht" werden würde - das ist aber egal.

    Was mache ich da Falsch?

    Viele Grüße
    Michael
    Bilder
    • Unbenannt1111.JPG

      72,45 kB, 756×999, 253 mal angesehen

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

    Du hast Dir doch Deine Antwort quasi selber schon gegeben: Deine Form ist > A4. Klar, dass die Vorschau da was abschneidet. Was willst Du denn erreichen, dass die Form dann verkleinert (x und y gleichmäßig runterskaliert) gedruckt wird?

    EDIT: @VaporiZed: Wer lesen kann, ist klar im Vorteil :S Du hattest ja schon gesagt, was Du willst ...
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nee, sorry. Meine erste Antwort war total Banane.
    Wenn Du in printDocument1_PrintPage vor e.Graphics.DrawImage eine Seitenskalierung machst (z.B. e.Graphics.ScaleTransform(0.2, 0.2)), dann wird das Formbild entsprechend vergrößert/verkleinert. Jetzt musst Du quasi nur noch rumrechnen: wie groß ist eine Form in Pixeln (Breite, Höhe), wieviele Pixel passen auf ne A4-Seite (auch Breite & Höhe), wie muss der Faktor bei ScaleTransform für x und y sein (beide Werte müssen gleich sein, sonst sieht es verzerrt aus), damit es seitenfüllend dargestellt wird.
    Das wär mein Ansatz. Vielleicht kommen ja noch effizientere.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also meine Idee waere es so zu machen, wenn das Foto der Form zu gross ist, es runter zu skallieren.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub DruckenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DruckenToolStripMenuItem.Click
    3. With PrintPreviewDialog1
    4. .Document = PrintDocument1
    5. .ShowDialog()
    6. End With
    7. End Sub
    8. Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    9. Using bmp As New Bitmap(Width, Height)
    10. DrawToBitmap(bmp, New Rectangle(0, 0, Width, Height))
    11. Dim maxSize As New SizeF(e.MarginBounds.Width, e.MarginBounds.Height)
    12. Dim newSize As SizeF = bmp.Size
    13. Dim var As Single = CSng(bmp.Width / bmp.Height)
    14. While newSize.Width > maxSize.Width
    15. newSize.Width -= 1
    16. newSize.Height = newSize.Width / var
    17. End While
    18. While newSize.Height > maxSize.Height
    19. newSize.Height -= 1
    20. newSize.Width = newSize.Height * var
    21. End While
    22. Dim destRect As New RectangleF(e.MarginBounds.X, e.MarginBounds.Y, newSize.Width, newSize.Height)
    23. e.Graphics.DrawImage(bmp, destRect)
    24. End Using
    25. End Sub
    26. End Class
    And i think to myself... what a wonderfuL World!
    An das Umrechnen von Formgröße auf Druckgröße habe ich auch gedacht, aber war mir 0 darüber einig wie ich es am besten anstelle.

    @Eddy: War grad mal so frei einfach deinen Code zu Kopieren und einzufügen - Genau das was ich gemeint habe !!

    Vielen vielen Dank !!

    Mit dem Graphics-Zeugs steh ich irgendwie auf Kriegsfuß :)

    Nochmal danke an alle!
    Auauau. Es wird Zeit für mich schlafen zu gehen ...
    @Eddy: Danke für den Denkanstoß. Man hat ja alle Werte schon durch e gegeben.

    VB.NET-Quellcode

    1. Dim srcRect As New RectangleF(0, 0, e.MarginBounds.Width, e.MarginBounds.Height)
    2. Dim Faktor = CSng(Math.Min(e.PageBounds.Width / memoryImage.Width, e.PageBounds.Height / memoryImage.Height) * 0.95) '!!!
    3. e.Graphics.ScaleTransform(Faktor, Faktor)
    4. e.Graphics.DrawImage(memoryImage, 0, 0, srcRect, GraphicsUnit.Millimeter)

    !!! => 0,95 ist ein Hack, den ich hier nur deshalb anwende, weil es so spät ist und meine Konzentration flöten geht :whistling:
    Sobald die Bilderfassung/Screenshoterstellung akkurat funktioniert (ist jetzt noch nicht der Fall, da Fremdpixel drumrum erfasst werden), kann man den Korrekturfaktor weglassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Eddy schrieb:

    Tintenverbrauch waere aber hoher.

    @michl75 Deswegen drucke ich zur Entwicklungszeit stets auf nen PDF-Drucker.
    Da lässt sich sehr schnell auf solche Eventualitäten reagieren.
    @michl75 250 Posts im Forum und Du bist immer noch der Meinung, Du hättest ein Problem, das noch nie jemand vor Dir gehabt hätte bzw. für das Bill nicht schon eine Lösung vorgesehen hätte.
    Sehr viele Prozeduren haben Überladungen (DrawImage(...)), die bekommst Du von der IDE sogar angeboten, hier 30 Stück:

    Da musst Du Dir nur die passende raussuchen.
    Feddich.
    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!
    Auch Dir einen guten Morgen.
    ...vielleicht habe ich es jetzt in den falschen Hals bekommen, aber 99% meiner "Probleme" löse ich durch "suchen" vor allem hier im Forum > es gibt nichts, was "einer" schon mal nicht behandelt hat. Gestern wusste ich nicht weiter, daher meine "Anfrage". Vllt. habe ich einfach "falsch" gesucht... wenn ich damit gegen "Regeln" verstoßen habe oder gar "...schlecht aufgestoßen bin" - Ich Bettel um Verzeihung!

    Dieses Forum ist klasse und ich möchte es nicht missen !!