VB.NET RichTextBox - Virtuelle Zeilen auslesen?

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB.NET RichTextBox - Virtuelle Zeilen auslesen?

    Hallo zusammen,

    ich stehe vor dem Problem, die Zeilen einer RichTextBox zeilenweise ausgeben zu wollen.
    Eigentlich ja nicht schwierig, das Problem ist jedoch, dass die Zeilen so ausgelesen werden
    müssten, wie sie in der RichTextBox stehen, und nicht wie sie normal im Text enthalten sind.

    Beispiel:
    Wenn in der RichTextBox "Hallo Tester!" in einer Zeile steht, wird das auch so ausgegeben.
    Wurde die RichTextBox allerdings so verkleinert, dass "Hallo" und "Tester!" in zwei verschiedenen Zeilen stehen, wird
    immernoch "Hallo Tester!" ausgegeben. Ich brauche aber, wenn es in der RichTextBox so angezeigt wird, auch "Hallo" und
    "Tester!" in zwei verschiedenen Zeilen.

    Hat jemand eine Idee welche Eigenschaft das sein könnte/
    welche Tricks man anwenden müsste?

    VisualBasic-Frager

    Ein String kann keine Sachen, wie Schriftgröße verarbeiten, er stellt Zeichen ganz normal dar.
    Du könntest Dir höchstens ne Art BB-Code basteln.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ach, jetzt. Hab das falsch interpretiert. Das Problem ist, dass das dann kein Zeilenumbruch, sondern ein Wrap ist und das wird wohl schwer zu erkennen sein. Aber eventuell geht das ja mit ​Lines.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    nein habs probiert eine Zeile wird nur erkannt wenn sie auch mit einem Zeilenumbruch aufhört.

    EDIT: optional müsste man den WordWrap der RTB auf false stellen dann muss zwingend ein Zeilenumbruch gemacht werden.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snaptu“ ()

    @HamburgerJungeJr MeasureString() ist gut.
    @VisualBasic-Frager In der Lines-Property kommen nur die Zeilen, die ein Return am Ende haben.
    Gugst Du hier. Das ist wie das Drucken eines mehrseitigen Textes auf einem sehr kleinen Zettel.
    Hab mal die entsprechenden Zeilen zusammengefasst, mit den Flags musst Du wohl ein wenig experimentieren:

    VB.NET-Quellcode

    1. Dim indexText As Integer = 0
    2. Dim ft = Me.RichTextBox1.Font
    3. Dim rc = New Rectangle(0, 0, Me.RichTextBox1.Width, ft.Height)
    4. ' System.Drawing.StringFormat, das Formatierungsinformationen für die Zeichenfolge darstellt.
    5. Dim stringFormat As New StringFormat(StringFormatFlags.LineLimit) ' Bestimmung der Zeilenanzahl
    6. ' Anzahl der Zeichen in der Zeichenfolge, die auf einmal gedruckt wird
    7. ' Zielgröße, abhängig von Font und Rechteck
    8. Dim charactersFitted As Integer
    9. ' Anzahl der Textzeilen in der Zeichenfolge, wird hier nicht weiter verwendet
    10. Dim linesFilled As Integer
    11. Dim bmp = New Bitmap(10, 10) ' um damit ein Graphics-Objekt erzeugen zu können
    12. Dim gr = Graphics.FromImage(bmp)
    13. ' Bestimmung der Anzahl der druckbaren Zeichen
    14. gr.MeasureString(Me.RichTextBox1.Text.Substring(indexText), ft, rc.Size, stringFormat, charactersFitted, linesFilled)
    15. MessageBox.Show(Me.RichTextBox1.Text.Substring(indexText, charactersFitted))

    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!