RichTextbox не предоставляет событие Paint. Так что трудно рисовать на фактической поверхности контроля. Вместо этого я добавил простой PictureBox прямо рядом с RichTextbox для аналогичного эффекта. С помощью некоторой простой математики определяется позиция для рисования линии, а затем DrawLine выполняет свою работу.
Событие загрузки
Установите здесь растровое изображение, на котором мы будем рисовать.
private void Form3_Load(object sender, EventArgs e)
{
this.richTextBox1.Text = Texts.Lorem;
// Create an bitmap
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
}
Нажатие кнопки
Когда мы начинаем поиск, определяем позицию искомого текста и затем вычисляем позицию для рисования линии
private void button1_Click(object sender, EventArgs e)
{
// find some text
var index = this.richTextBox1.Find(this.textBox1.Text);
if (index>-1)
{
using (var gr = Graphics.FromImage(pictureBox1.Image))
{
// calculate where to postion the bar
var textpos = index / (double)this.richTextBox1.Text.Length;
var position = (double) pictureBox1.Height * textpos;
Trace.WriteLine(String.Format("{0}:{1}:{2}", index, textpos, position));
// draw it
gr.DrawLine(new Pen(Color.Red, 4), 0, (int)position, pictureBox1.Width, (int)position);
pictureBox1.Invalidate();
}
}
}
Форма закрыта
Не забудьте очистить растровое изображение
private void Form3_FormClosed(object sender, FormClosedEventArgs e)
{
var bmp = pictureBox1.Image as IDisposable;
if (bmp!= null )
{
bmp.Dispose();
}
}
При запуске это то, что вы получаете: