Как выделить на фоне полосы прокрутки richtextbox относительную позицию выделенного фрагмента текста - PullRequest
3 голосов
/ 14 марта 2012

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

Примером этого может служить пункт «влево», он вставляет небольшую строку в каждое место, где код не соответствует пересмотренной копии. Так что вы можете быстро перейти к нему.

1 Ответ

1 голос
/ 24 июля 2016

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();
    }
}

При запуске это то, что вы получаете:

demo of redline on position

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...