【问题标题】:How to highlight on a richtextbox scrollbar background the relative position of a selected piece of text如何在richtextbox滚动条背景上突出显示选定文本的相对位置
【发布时间】:2016-07-25 03:55:14
【问题描述】:

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

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

【问题讨论】:

  • 你想在richtextbox的滚动条上画画吗?对吧!
  • 我想绘制更具体的滚动条背景,而不是滚动条本身。

标签: c# winforms


【解决方案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();
    }
}

运行时会得到以下结果:

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多