2009-11-20 15 views
10

Tengo una aplicación de Winforms que contiene un RichTextBox.Winforms RichTextBox: ¿Cómo puedo determinar cuántas líneas de texto son visibles?

¿Cómo puedo determinar cuántas líneas de texto se muestran, actualmente visibles?

Motivo: Quiero desplazar el cursor al medio de RichTextBox. Puedo usar RichTextBox.ScrollToCaret(), pero eso coloca el símbolo de intercalación en la parte superior de RichTextBox. Me imagino, si sé cuántas líneas se muestran, podría mover el cursor "atrás" n/2 líneas, luego llamar a ScrollToCaret(), luego restaurar la posición original del cursor.

EDIT:

encontré EM_GETLINECOUNT, lo cual pensé que era la respuesta, excepto el doctor dice: El mensaje EM_GETLINECOUNT recupera el número total de líneas de texto, no sólo el número de líneas que son actualmente visibles .

Tantalizingly, también hay EM_GETFIRSTVISIBLELINE, que obtiene la primera línea visible, pero no pude encontrar un GETLASTVISIBLELINE. ??


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

+0

Simplemente interesado: ¿qué vas a hacer con esta información? Te das cuenta de que esto podría ser variable, porque puedes tener diferentes fuentes y relleno en todo el texto. –

+0

Se construyó un RTB personalizado que muestra los números de línea: http://stackoverflow.com/questions/2567263/how-to-show-number-of-a-line-in-a-richtextbox-c/2668264#2668264 – Cheeso

Respuesta

16

Bueno, esto no es bastante, pero funciona para mí. Básicamente estoy verificando un punto justo dentro de la esquina superior izquierda de richtextbox y un punto justo dentro de la esquina inferior izquierda del cuadro de texto. Puede que tenga que ajustar las coordenadas del punto según cómo se muestre su richtextbox. Luego obtengo el índice de caracteres más cercano a cada uno de esos dos puntos y recupero la línea en la que se encuentra.

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 

Lo probé para richtextboxes con múltiples tamaños de fuentes que se muestran, y parece que funciona. Sospecho que la respuesta que se devuelve estará desactivada (demasiado pequeña) en una línea si la última línea del texto mostrado tiene mucho espacio en blanco debajo y la siguiente línea está casi lista para mostrarse. Si tienes un richtextbox muy alto, con muchas líneas, esto no debería ser un problema.

+1

funcionó perfectamente. Gracias. – Cheeso

+0

Brillante. Muchas gracias. – Larry

0

para mostrar el número de líneas que un RichTextBox es capaz de mostrar, incluso si no hay un texto que hay en la actualidad, tratan:

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 

Este utiliza la altura de una carta de prueba 'A' en el actual fuente para encontrar la altura de la línea en píxeles.

Cuestiones relacionadas