mehrere Zeichnungen auf eine Seite speichern/drucken

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von neuling.

    mehrere Zeichnungen auf eine Seite speichern/drucken

    Hallo Leute,
    ich möchte gerne mehrere Zeichnungen auf eine Seite abbilden und speichern /ausdrucken.
    Habe folgendes Testprogramm gemacht: Man gibt eine Zahl ein (1,2 oder 3) und je nachdem was für eine Zahl man eingibt erscheint nach dem klicken auf einen Button eine Zeichnung (Polygon.Ellipse...) in einer PicBox. Des weiteren gibt es zwei zusätzliche Knöpfe. Ein Knopt um alle angezeigten Bilder untereinander auf eine Seite angebracht zu speichern. Ein weiterer Knopf um alle gezeichneten Sachen auf einer Seite untereinander angebracht zu drucken.

    Das Problem ist wenn ich meine Zeichnung mit "DrawImage drucke" sehen die Linien verpixelt aus. Deshalb wollte ich wissen ob ich direkt (nicht als DrawImage) die Zeichnung ausdrucken kann.
    Wenn ich z.B einfach ein Rechteck in der Druck/PrintPage Prozedur zeichnen lasse dan wird das Rechteck schön gedruckt (nicht so verpixelt).
    Habe versucht einfach unter "Private Sub Druck..." g=g2 zu definieren und dann mit g.Flush() das auszugeben aber ich glaube das funzt so nicht da ich hier beim Drucken nichts abgedruckt wird. ?(

    VB.NET-Quellcode

    1. Dim bild1 As Bitmap
    2. Dim seite As Bitmap = New Bitmap(500, 500)
    3. Dim grf As Graphics
    4. Dim g2 As Graphics
    5. Dim ft As New Font("Arial", 10)
    6. Dim pinsel As New SolidBrush(Color.Red)
    7. Dim zf As String
    8. Dim abstand As Integer
    9. ...
    10. Private Sub cmdAnzeigen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAnzeigen.Click
    11. bild1 = New Bitmap(picAnzeige.Width, picAnzeige.Height)
    12. grf = Graphics.FromImage(bild1)
    13. g2 = Graphics.FromImage(seite)
    14. zf = txtEingabe.Text
    15. If zf = "1" Then
    16. loeschen(bild1)
    17. zeichne1(zf)
    18. ElseIf zf = "2" Then
    19. loeschen(bild1)
    20. zeichne2(zf)
    21. ElseIf zf = "3" Then
    22. loeschen(bild1)
    23. zeichne3(zf)
    24. End If
    25. picAnzeige.Image = bild1
    26. End Sub
    27. Public Sub zeichne1(ByVal sfolge As String)
    28. abstand += 100
    29. pinsel.Color = Color.Red
    30. grf.FillRectangle(pinsel, 10, 0, 100, 50)
    31. g2.FillRectangle(pinsel, 10, abstand, 100, 50)
    32. g2.DrawString(zf, ft, Brushes.Black, ((picAnzeige.Width / 2) - ((Len(zf) / 2) * 7)), _
    33. abstand + (picAnzeige.Height / 2) + 2)
    34. End Sub
    35. ...
    36. Public Sub zeichne2...
    37. Public Sub zeichne3...
    38. Private Sub cmdSpeichern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSpeichern.Click
    39. Dim img2 As Image = seite
    40. g2 = Graphics.FromImage(seite)
    41. img2.Save(Application.StartupPath & "/test1.emf", System.Drawing.Imaging.ImageFormat.Emf)
    42. End Sub
    43. ...
    44. Private Sub Druck(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
    45. Handles doc.PrintPage
    46. Dim g As Graphics = e.Graphics
    47. g.DrawImage(seite, 0, 0) 'als bild druckbar
    48. End Sub
    Danke für die Antwort.
    Wenn ich versuche in zeichne2 folgendes zu zeichnen

    VB.NET-Quellcode

    1. pinsel.Color = Color.White
    2. g.FillRectangle(pinsel, 110, 10, 1, 50)
    3. pinsel.Color = Color.Black
    4. g.FillRectangle(pinsel, 111, 10, 1, 50)
    5. pinsel.Color = Color.White
    6. g.FillRectangle(pinsel, 112, 10, 1, 50)
    7. g.FillRectangle(pinsel, 113, 10, 1, 50)
    8. pinsel.Color = Color.Black
    9. g.FillRectangle(pinsel, 114, 10, 1, 50)


    und es auszudrucken macht es bei mir keinen Unterschied ob ich mit oder ohne smooth mache ?(
    Ich habe

    VB.NET-Quellcode

    1. g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    2. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

    verwendet aber wie gesagt das hat bei mir keinen Unterschied gemacht (Laserdrucker).
    Gibt es ne Möglichkeit meine Zeichnung auf einer "virtuellen Zeichenfläche" zu machen und dann für das Speichern einfach die "virtuellen Zeichenfläche" als image speichern und fürs Drucken, dem Drucker die "virtuellen Zeichenfläche" übergeben ?

    VB.NET-Quellcode

    1. Dim g As Graphics = e.Graphics
    2. g="virtuelle Zeichenfläche"
    3. g.neuzeichnen


    Kanns leider net so gut erklären :)
    (meine Notlösung ist die Eingabe vom user zu speichern und dann beim drucken alles nochmal zeichnen zu lassen -> von hinten durch die Brust ins Auge :D )