Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Endkoordinate von mehrzeiligem String bestimmen


Silas - Do 05.06.08 18:54
Titel: Endkoordinate von mehrzeiligem String bestimmen
Moin! :wave:

Folgendes Problem: Ich möchte für eine selbstgezeichete Konsole (unter .NET) das Caret am Ende des Eingabestrings zeichnen. Bei einem Einzeiligen ist das natürlich kein Problem, ich ermittle einfach mit MeasureString die Größe des Bereichs, den der String benötigt (Die Funktion entspricht unter Delphi Canvas.TextWidth.
Bei Strings, die am Ende der Zeile automatisch umgebrochen werden, ist das so nicht möglich, weil das Caret dadurch zwar in der richtigen Zeile, aber am rechten Rand (der Breite der Box) landet.

Mein erster Ansatz wäre jetzt gewesen, die Position zu brute-forcen, indem ich einfach alle Zeichen bis zum letzten Umbruch zähle und dann die Größe der letzten Zeile ermittle. Es dürfte klar sein, dass das nicht übermäßig performant ist, vor allem, weil ich bei jedem Caret-Blink neuzeichne (gut, dass ließe sich zwar reduzieren, indem ich zeichne und zurückkopiere, aber zumindest bei jeder neuen Eingabe ist es notwendig).
Ich könnte zwar davon ausgehen, dass es eine Monospace-Schrift ist, aber das möcht ich ehrlich gesagt auch lieber nicht.

Gibt es irgend eine einfachere bzw. sauberere Methode dafür? Bei Textboxen funktioniert das ja schließlich auch...

Danke!
Silas


delfiphan - Do 05.06.08 20:59

Wäre es evtl. nicht performanter die Zeilenumbrüche selbst zu verwalten? Oder willst du den gesamten Inhalt wirklich in einem einzigen langen String haben?


Silas - Do 05.06.08 21:04

Moin delfiphan,

die Zeilenumbrüche verwalte ich schon selber, ich meinte damit eigentlich die automatischen Zeilenumbrüche, die ein Canvas verursacht, wenn man Text in ein Rechteck zeichnet und der länger wird, als das Reckteck breit ist.