Winforms RichTextBox: как определить, сколько строк текста видно?

У меня есть приложение Winforms, содержащее RichTextBox.

Как определить, сколько строк текста отображается в настоящее время?

Причина: Я хочу прокрутить каретку до середины RichTextBox. Я могу использовать RichTextBox.ScrollToCaret(), но это помещает каретку в начало RichTextBox. Я полагаю, что если я знаю, сколько строк отображается, я мог бы перемещать каретку "назад" n/2 линии, а затем вызвать ScrollToCaret(), а затем восстановить исходную позицию каретки.

EDIT:

Я нашел EM_GETLINECOUNT, который, как я думал, был ответом, за исключением документа: сообщение EM_GETLINECOUNT извлекает общее количество текстовых строк, а не только количество отображаемых в настоящее время строк.

Тщательно, есть также EM_GETFIRSTVISIBLELINE, который получает первую видимую строку, но я не смог найти GETLASTVISIBLELINE.??


по теме:
Как прокрутить каретку до середины RichTextBox?

Ответ 1

Ну, это некрасиво, но это работает для меня. В основном я проверяю точку только в верхнем левом углу richtextbox и точку, расположенную в левом нижнем углу текстового поля. Возможно, вам придется настроить координаты точек в зависимости от того, как отображается ваш richtextbox. Затем я получаю индекс символа, который ближе всего к каждой из этих двух точек, и извлекает строку, в которой он находится.

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

Я тестировал его для richtextboxes с несколькими размерами отображаемых шрифтов, и, похоже, он работает. Я подозреваю, что ответ, который будет возвращен, будет отключен (слишком мал) одной строкой, если в последней строке отображаемого текста будет много свободного пробела, а следующая строка почти готова к отображению. Если у вас очень высокий richtextbox, со многими строками, это не должно быть проблемой.

Ответ 2

Чтобы отобразить количество строк, которые RichTextBox может отображать, даже если там нет текста, попробуйте:

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

Это использует высоту тестовой буквы "A" в текущем шрифте, чтобы найти высоту строки в пикселях.