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

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

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

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

EDIT:

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

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


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

2 ответов


Ну, это не красиво, но это работает для меня. В основном я проверяю точку внутри верхнего левого угла richtextbox и точку внутри нижнего левого угла textbox. Возможно, вам придется настроить координаты точек в зависимости от того, как отображается 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, со многими линиями, это не должно быть проблемой.


чтобы отобразить количество строк, которое может отображать 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 " в текущем шрифте, чтобы найти высоту строки в пикселях.