如何在richtextbox滚动条背景上突出显示所选文本的相对位置

时间:2012-03-14 14:56:23

标签: c# winforms

我想在richtextbox的滚动条背景上突出显示所选文本的位置。基本上我使用richtextbox.find命令来查找文本。然后我突出显示这个文本,所以那里都很好。但我也想在滚动条背景上标记这个位置。因此,对于用户,他们会看到他们必须向下滚动以在滚动条背景上说出一条红线以查找他们搜索的内容。这需要适用于多个不同的单词,这些单词可以位于文本框的不同位置。

这方面的一个例子是左侧的tortisemerge,它在每个地方放置一条代码与修订后的副本不匹配的行。所以你可以快速滚动到它。

1 个答案:

答案 0 :(得分:1)

RichTextbox不会公开Paint事件。因此很难在实际的控制界面上绘画。相反,我在RichTextbox旁边添加了一个简单的PictureBox,以获得类似的效果。通过一些简单的数学运算,确定绘制线的位置,然后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