Drucken: PageBounds-Problem

  • VB.NET

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

    Drucken: PageBounds-Problem

    Hallo an alle,

    ich habe mal wieder ein kleines Problem.

    Und zwar möchte ich mir in meinem Programm ein Dokument selber zusammenbauen. Zum Testen habe ich mir extra ein Projekt angelegt. Mein erstes Ziel ist es, ein Rechteck auf dem oberen Teil der Seite zu positionieren und darin zwei Textzeilen zu schreiben. Von den Positionen her passt auch alles soweit, allerdings passt die Breite des Rechtecks irgendwie nicht so richtig.

    Das Rechteck soll mit 30 pt Abstand nach oben, links und rechts positioniert werden. Der Rand oben und links passt auch, da man beim Rechteck ja aber die Breite angeben muss, sollte man meinen, dass man dies einfach mit

    VB.NET-Quellcode

    1. e.PageBounds.Width - 60
    lösen könnte, allerdings läuft mein Rechteck dann nach rechts aus der Seite heraus. ?( Wenn ich statt minus 60, durch 2 nehme, befindet sich die rechte Seite des Rechtecks auch nicht auf der Hälfte der Seite, sondern eher bei 2/3 der Seite.

    Meine Frage nun: Wie muss ich das Rechteck definieren, sodass es auch auf der rechten Seite 30 pt Abstand zum Seitenrand hat?

    Gruß, bomberman2910
    Hallo,

    mittlerweile konnte ich mein Problem mit den Rändern auf anderem Wege lösen. Dieser ist vielleicht nicht so schön und sauber wie der im geposteten Thema, aber er erfüllt seinen Zweck doch allemal. Trotzdem vielen Dank für die Hilfe.
    Jetzt würde mich doch aber trotzdem noch mal rein aus Neugier interessieren, warum VB diese Werte für "PageBounds" und auch für "MarginBounds" so seltsam/"falsch" interpretiert. Wenn man an der Standardeinheit nichts ändert, müsste doch eigentlich alles stimmen oder habe ich da was wichtiges übersehen? Immerhin befinden sich die "MarginBounds" für unten und rechts bei mir irgendwo mitten auf der Seite.

    Gruß, bomberman2910

    bomberman2910 schrieb:

    so seltsam/"falsch"
    Beim Paint hast Du Pixel, beim Drucken DPI oder so.
    Du kannst die verwendete Einheit auch vorgeben. Ist das dann immer noch merkwürdig?

    VB.NET-Quellcode

    1. e.Graphics.PageUnit = GraphicsUnit.Millimeter
    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!
    Das man das vorgeben kann, weiß ich ja. Es hatte mich bloß gewundert, dass "PageBounds" irgendwo außerhalb der Seite endet, obwohl es sich nach Adam Riese genau 30 pt vom rechten Rand befinden sollte und dass "MarginBounds" irgendwo mitten auf der Seite aufhört, obwohl es sich hierbei um vordefinierte Ränder handelt, die sich eigentlich immer an Rand der Seite befinden sollten. Ich denke, dass das aber auch auf den Einheitenunterschied bei Paint und Print zurückzuführen ist, da die Maße zumindest halbwegs gepasst haben, als ich Margin- und PageBounds im Programm von Pixel nach Punkt umgerechnet hatte.
    @bomberman2910 Was für ein Papierformat hast Du ausgewählt?
    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!
    In welcher Prozedur hast Du denn diese Zeile?

    bomberman2910 schrieb:

    VB.NET-Quellcode

    1. e.PageBounds.Width - 60
    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!

    bomberman2910 schrieb:

    Also genau
    ist Deine Abtwort nicht.
    Ich hatte so was erwartet:

    VB.NET-Quellcode

    1. Private Sub Paint(...)
    2. 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!

    VB.NET-Quellcode

    1. Dim Rect_Body As New Rectangle(30, CInt((e.PageBounds.Top) + 33), CInt(e.PageBounds.Width - 60), CInt((e.PageBounds.Height) - 33))

    In der Prozedur:

    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument_Drucken.PrintPage
    Hier ist der Rahmen bereits festgelegt, Du kannst ihn nicht mehr ändern.
    Innerhalb des Rechtecks solltest Du drucken können.
    Kommen die Werte in der richtigen Einheit?
    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!
    Das Problem war ja nicht, dass ich da drin nicht drucken konnte, sondern, dass das Recteck zwar links mit 30 pt Abstand angefangen hat, aber nach rechts aus der Seite rausgelaufen ist. Ich habe dann die PageBounds-Werte mal spaßeshalber in Pixel umgerechnet und siehe da: Das Rechteck war immerhin in der Seite drin, allerdings nicht mit genau 30 pt Abstand (könnte darauf zurückzuführen sein, dass der Wert als Integer geparst wird) zur rechten Seite. Laut MSDN müsste das Ändern der Einheit doch aber eigentlich alle Werte betreffen, also auch PageBounds und MarginBounds.
    @bomberman2910 Druck doch mal dieses Rechteck (PagePreview reicht).
    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 habe jetzt mal zweimal gedruckt: Einmal eins, wo ich die PageBounds-Werte nicht nach Punkt um gerechnet habe (Print_Point.jpg) und einmal, wo ich die Werte umgerechnet habe(Print_Pixel.jpg).
    Bilder
    • Print_Pixel.jpg

      24,86 kB, 604×724, 143 mal angesehen
    • Print_Point.jpg

      26,88 kB, 816×729, 146 mal angesehen
    Die beiden Bilder müssen identisch sein.
    Mach das ganze mal in Single.
    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!

    bomberman2910 schrieb:

    dasselbe
    Hast Du die komplette Koordinaten-Rechnung in Single genacht oder nur die Integer-Werte nach Single gecastet?
    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!
    Also bei der Variante ohne Umrechnung wird er wohl gleich die Integer-Werte genommen haben und bei der Variante mit Umrechnung musste ich von Double nach Single casten, weil Divisionen automatisch als Double angesehen werden.
    Das ist in Ordnung.
    Wenn Du Polygone und Ellipsen-Teile zusammensetzt, ist Single deutlich besser als Integer.
    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!