2009-11-20 5 views
10

Ich habe eine Winforms App, die eine RichTextBox enthält.Winforms RichTextBox: Wie kann ich feststellen, wie viele Textzeilen sichtbar sind?

Wie kann ich feststellen, wie viele Textzeilen angezeigt werden, derzeit sichtbar?

Grund: Ich möchte den Caret in die Mitte der RichTextBox scrollen. Ich kann RichTextBox.ScrollToCaret() verwenden, aber das setzt das Caret an der Spitze der RichTextBox. Ich denke, wenn ich weiß, wie viele Zeilen angezeigt werden, könnte ich das Caret "n"/2 Zeilen "zurück" bewegen, dann ScrollToCaret() aufrufen und dann die ursprüngliche Caret-Position wiederherstellen.

EDIT:

I EM_GETLINECOUNT gefunden, was ich dachte, war die Antwort, mit Ausnahme der doc sagt: Die EM_GETLINECOUNT Nachricht die Gesamtzahl der Textzeilen abruft, nicht nur die Anzahl der Zeilen, die derzeit sichtbar sind .

Verlockend gibt es auch EM_GETFIRSTVISIBLELINE, die die erste sichtbare Zeile erhält, aber ich konnte nicht finden, eine GETLASTVISIBLELINE. ??


Verwandte:
How can I scroll the caret to the middle of the RichTextBox?

+0

Nur interessiert - was werden Sie mit dieser Information tun? Sie erkennen, dass dies variabel sein kann, da Sie im gesamten Text unterschiedliche Schriftarten und Abstände haben können. –

+0

Es wurde in eine benutzerdefinierte RTB erstellt, die Zeilennummern anzeigt: http://stackoverflow.com/questions/2567263/how-to-show-number-of-a-line-in-a-richtbox-c/2668264#2668264 – Cheeso

Antwort

16

Nun, das ist nicht schön, aber es funktioniert für mich. Grundsätzlich überprüfe ich einen Punkt in der oberen linken Ecke der Richtextbox und einen Punkt in der unteren linken Ecke der Textbox. Je nachdem, wie Ihre Richtextbox angezeigt wird, müssen Sie möglicherweise die Punktkoordinaten anpassen. Dann erhalte ich den Zeichenindex, der jedem dieser beiden Punkte am nächsten kommt, und erhalte die Zeile, auf der er sich befindet.

Dim topIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, 1)) 
Dim bottomIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, RichTextBox1.Height - 1)) 

Dim topLine As Integer = RichTextBox1.GetLineFromCharIndex(topIndex) 
Dim bottomLine As Integer = RichTextBox1.GetLineFromCharIndex(bottomIndex) 

Dim numLinesDisplayed As Integer = bottomLine - topLine 

Ich habe es für Richtextboxen mit mehreren Schriftgrößen getestet, und es scheint zu funktionieren. Ich vermute, dass die Antwort, die zurückgegeben wird, um eine Zeile aus ist (zu klein), wenn die letzte Zeile des angezeigten Texts viel Leerraum darunter hat und die nächste Zeile fast bereit ist, angezeigt zu werden. Wenn Sie eine sehr große Richtextbox mit vielen Zeilen haben, sollte das kein Problem sein.

+1

hat perfekt funktioniert. Vielen Dank. – Cheeso

+0

Brilliant. Vielen Dank. – Larry

0

die Anzahl der Zeilen anzuzeigen, die ein RichTextBox darstellen kann, auch wenn es dort derzeit kein Text ist, versuchen:

Dim s As SizeF = TextRenderer.MeasureText("A", rtb.Font, rtb.Size, TextFormatFlags.WordBreak) 
Dim letterHeight As Integer = CInt(s.Height) 
Dim displayableLines As Integer = rtb.Height/letterHeight 

Dies verwendet die Höhe eines Test Buchstaben ‚A‘ in der aktuellen Schriftart, um die Zeilenhöhe in Pixeln zu finden.