Я создал немодальное диалоговое окно поиска для использования при поиске в RichTextBox, и у меня возникают проблемы с позиционированием диалогового окна поиска после того, как найденный текст выбран, чтобы он не покрывал выделенный текст.Я попытался получить номер строки относительно клиентской области, используя следующее:
this.lineCount = this.rtb.Height / (this.rtb.Font.Height+2);
rtb.Select(rtbIndex, searchText.Length);
int linePos = (this.rtb.GetLineFromCharIndex(this.rtb.GetFirstCharIndexOfCurrentLine())) % this.lineCount;
if(linePos<(this.lineCount/2))
{
this.Location = rtb.PointToScreen(new Point(rtb.Bounds.Left, rtb.Bounds.Bottom - this.Height));
}
else
{
this.Location = rtb.PointToScreen(new Point(rtb.Bounds.Left, rtb.Bounds.Top));
}
this.lineCount - это количество строк, которые помещаются в клиентскую область на основе высоты шрифта и высоты шрифта.RichTextBox.Это точное значение, которое я проверил.Мой код помещает диалоговое окно поиска внизу richtextbox, если lineNum меньше половины значения this.lineCount, в противном случае вверху
Однако linePos ненадежен.Иногда значение имеет ноль, когда строка с выделенным текстом является 19-й строкой, а lineCount - 20, поэтому диалог перемещается по выделенному тексту.Таким образом, он не позволяет точно рассчитать, где richtextbox отображает выделенный текст.