Drucken mit GDI: Zentrierung?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Sebastian.Trzynka.

    Drucken mit GDI: Zentrierung?

    Hallo zusammen,
    ich habe nach längerer Abwesenheit ein Problem, bei dem ich nicht mehr weiter weiß. Ich möchte per GDI Etiketten drucken, funktioniert auch gut soweit, bis auf die Tatsache, dass die Etiketten nicht mittig gedruckt werden, sondern ca. 0,5cm nach rechts und unten versetzt (das entspricht dem physikalischen Druckrand meines Druckers), er druckt also über den Rand hinaus.
    Ich habe jetzt testweise mal so gedruckt:

    VB.NET-Quellcode

    1. Private Sub MyDoc_PrintPage1(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    2. Dim w As Integer = e.PageBounds.Width
    3. Dim h As Integer = e.PageBounds.Height
    4. e.Graphics.DrawLine(Pens.Black, New Point(w / 2, 0), New Point(w / 2, h ))
    5. e.Graphics.DrawLine(Pens.Black, New Point(0, h / 2), New Point(w , h / 2))
    6. End Sub


    Habt ihr eine Idee? Die Seitenränder die mir angegeben werden (e.Marginbounds.Top...) sind alle 100px, deutlich zu viel.
    Vielen Dank und viele Grüße,
    Sebastian
    Viele Grüße
    Sebastian
    Kannst du dann nicht einfach nen Offset von 0.5cm reinpacken in die EventArgs ? Weiß ich grad selbst nicht, nur ne Idee...
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @Sebastian.Trzynka
    Verwende mal statt PageBounds ==> VisibleClipBounds.
    Und 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!

    Sebastian.Trzynka schrieb:

    Ich möchte per GDI Etiketten drucken, funktioniert auch gut soweit, bis auf die Tatsache, dass die Etiketten nicht mittig gedruckt werden, sondern ca. 0,5cm nach rechts und unten versetzt

    So spontan:
    Du verwendest PageBounds für die Ermittlung von Breite und Höhe des druckbaren Bereichs, die GDI-Positionen haben als Bezug aber nicht die PageBounds sondern die e.PageSettings.PrintableArea, die zusätzlich einen kleinen Rand ("nicht-druckbar") hat. Dieser Rand ist von Drucker zu Drucker unterschiedlich breit und viele Drucker (aber nicht alle) können dennoch in diesem Rand drucken.

    Wenn du z.B. das ganze Etikett vollschmieren willst ohne diesen Rand zu berücksichtigen, kannst du versuchen, deine Koordinaten für die GDI-Ausgaben um e.PageSettings.PrintableArea.Left und e.PageSettings.PrintableArea.Top zu reduzieren (so dass am oberen und linken Rand zuweilen negative Koordinaten rauskommen können).
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Schade, das war doch nix. Wenn ich das Etikett über den XPS-Exporter "drucke" und dann über den Viewer drucke, ist es mittig. Wenn ich es direkt aus meinem Programm drucke, versetzt. Die Maße erhalte ich nun wie oben geschrieben, genauso wie den Druckrand (beides in Mydoc_Printpage)

    VB.NET-Quellcode

    1. e.Graphics.PageUnit = GraphicsUnit.Millimeter
    2. Dim w As Single = e.Graphics.VisibleClipBounds.Width
    3. Dim h As Single = e.Graphics.VisibleClipBounds.Height
    4. Dim t As Single = e.Graphics.VisibleClipBounds.Top
    5. Dim l As Single = e.Graphics.VisibleClipBounds.Left
    6. Dim randseite As Single = 8
    7. Dim randoben As Single = 13.1
    8. Dim etikettbreite As Single = 97
    9. Dim etiketthöhe As Single = 67.7
    Viele Grüße
    Sebastian
    Sorry für den Selbstquote, aber das wurde scheinbar übersehen:

    Arby schrieb:

    die GDI-Positionen haben als Bezug aber nicht die PageBounds sondern die e.PageSettings.PrintableArea
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Also. Ich habe nun etliche Varianten ausprobiert, extra in einem separatem Programm, um andere Probleme auszuschließen. Ich habe den Code von @RodFromGermany aus dem Beispiel genutzt und mir nur die vier Eckpunkte drucken lassen, es passt auf dem gedruckten Blatt noch immer nicht. Die Ränder habe ich angepasst, der Standarddruckrand war 100px bzw. 100mm.

    VB.NET-Quellcode

    1. Private Sub PrintDocument2_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument2.PrintPage
    2. Dim g = e.Graphics
    3. Dim rc = e.PageSettings.PrintableArea
    4. Dim margin = e.PageSettings.Margins
    5. margin.Left = rc.Width / 210 * 5
    6. margin.Right = rc.Width / 210 * 5
    7. margin.Top = rc.Height / 297 * 14
    8. margin.Bottom = rc.Height / 297 * 14
    9. rc.Offset(margin.Left, margin.Top)
    10. rc.Width -= (margin.Left + margin.Right)
    11. rc.Height -= (margin.Top + margin.Bottom)
    12. g.FillRectangle(Brushes.Black, New Rectangle(New Point(rc.Location.X, rc.Location.Y), New Size(New Point(4, 4))))
    13. g.FillRectangle(Brushes.Black, New Rectangle(New Point(rc.Location.X + rc.Width, rc.Location.Y), New Size(New Point(4, 4))))
    14. g.FillRectangle(Brushes.Black, New Rectangle(New Point(rc.Location.X, rc.Location.Y + rc.Height), New Size(New Point(4, 4))))
    15. g.FillRectangle(Brushes.Black, New Rectangle(New Point(rc.Location.X + rc.Width, rc.Location.Y + rc.Height), New Size(New Point(4, 4))))
    16. e.HasMorePages = False
    17. End Sub
    Viele Grüße
    Sebastian

    Sebastian.Trzynka schrieb:

    ausprobiert
    Probier dies:
    Mach aus New Point(4, 4) ==> New Point(40, 40). :D
    Bilder
    • Print.png

      8,44 kB, 375×546, 152 mal angesehen
    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!