Laden...

PrintDocument - Drucken, TabStopp bei Linebreak berücksichtigen

Erstellt von nicky vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.828 Views
N
nicky Themenstarter:in
232 Beiträge seit 2011
vor 6 Jahren
PrintDocument - Drucken, TabStopp bei Linebreak berücksichtigen

Hi !

Ich nutze PrintDocument um eine Quittung mit einem TSP100-Drucker zu drucken.

Meine Methode druckt Text linksbündig. Wenn der Text zu lang ist, wird dieser umgebrochen. Das entsprechende Rectangle berechne ich mit MeasureString.

Aktuelles Ergebnis, keine Überlänge:


String: "Vorname:\tThomas..."

Vorname:        Thomas

Aktuelles Ergebnis, Überlänge:


String: "Vorname:\tThomas ABCDEFGHIJK..."

Vorname:        Thomas ABCD
EFGHIJK

Wunschergebnis:


String: "Vorname:\tThomas ABCDEFGHIJK..."

Vorname:        Thomas ABCD
                EFGHIJK

Die Frage ist, wie gehe ich vor damit der TabStopp auch beim Zeilenumbruch berücksichtigt wird?

        private void PrintTextLeft(Graphics g, string headline, ref float yPostion, Font customFont = null)
        {
            StringFormat stringFormat = new StringFormat();
            stringFormat.LineAlignment = StringAlignment.Near;
            stringFormat.Alignment = StringAlignment.Near;
            stringFormat.SetTabStops(0.0f, formatTabs);

            var font = (customFont == null) ? GetFont() : customFont;
            SizeF sizeF = g.MeasureString(headline, font, WIDTH);

            g.DrawString(headline, font, Brushes.Black, new RectangleF(new PointF(0, (int)yPostion), new Size(WIDTH, (int)yPostion)), stringFormat);
            yPostion += sizeF.Height;
        }
N
nicky Themenstarter:in
232 Beiträge seit 2011
vor 6 Jahren

Also ich habe mir jetzt geholfen indem ich nicht mehr einen String, sondern zwei Strings drucken pro Zeile:

Aus:
"Vorname:\tThomas ABCDEFGHIJK..."

Wird:
"Vorname:"
"Thomas ABCDEFGHIJK..."

Beim ersten erhöhe ich den Y Wert nicht damit der zweite Wert in der selben Zeile ist und den zweiten Werte drucke ich mit einem X-Offset in Höhe des Tabstopps. Naja, geht aber mich würde eine andere Lösung trotzdem interessieren!

T
461 Beiträge seit 2013
vor 6 Jahren

Hallo,

du könntest das \t durch die Anzahl an Leerzeichen ersetzen, die der Tab bietet.

Somit hättest das Problem nicht mehr.

Ob das jetzt die optimale Lösung ist, ist wieder eine andere Frage... 😉

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

3.003 Beiträge seit 2006
vor 6 Jahren

Du bist mit MeasureString schon auf der richtigen Fährte. Berechne die zu erwartende gerenderte Länge inkl. Tabs und umbrich[1] den Text so lange, bis die Länge nicht mehr zu lang ist.

Anders wird's nichts, weil die Breite eines Tabs - ebenso wie die Breite der Schrift - von der Schriftart abhängig ist.

LaTino
[1] Partizip II von umbrechen i.S.v. "Text umbrechen" ist übrigens "umbrochen", nicht "umgebrochen" - letzteres würde man mit einem Feld machen. Deutsches Sprach, schweres Sprach 😉.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
2.121 Beiträge seit 2010
vor 6 Jahren

Warum nicht anders? Überlegen wir, was möchtest du haben? -> Zweispaltigen Text.
Also mache zwei DrawString Statements draus. "Vorname" links drucken. Und den Namen an eine andere x Koordinate drucken, der kann dann umbrechen so oft er möchte und wird immer wieder am passenden linken Rand beginnen.

An der Lösung mit Tabs würde mich schon stören dass ich keine Kontrolle habe wo der Tab ist.