在RichTextBox上绘图

7

我想在RichTextBox中绘制单词和段落的边框,但是当我打开UserPaint时,它不再绘制文本,而我的自定义绘画似乎可以工作。也许我忘记打开其他东西了吗?这是我的代码:

public partial class RichTextBoxEx : RichTextBox
{
    public RichTextBoxEx()
    {
        InitializeComponent();
        SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        //Do some painting here
    }
}

参考这个问题的信息并没有帮助到我。


因为我在添加了那个示例代码后仍然无法进行文本绘制。 - Demarsch
2个回答

8

对我来说这个方法效果不错:

class RichBox : RichTextBox {
  private const int WM_PAINT = 15;

  protected override void WndProc(ref Message m) {
    if (m.Msg == WM_PAINT) {
      this.Invalidate();
      base.WndProc(ref m);
      using (Graphics g = Graphics.FromHwnd(this.Handle)) {
        g.DrawLine(Pens.Red, Point.Empty, 
                   new Point(this.ClientSize.Width - 1,
                             this.ClientSize.Height - 1));
      }
    } else {
      base.WndProc(ref m);
    }
  }
}

@Demarsch 将 Invalidate() 行注释掉,然后在框中放入足够的文本以开始滚动并查看发生了什么。 - LarsTech
嗯,我明白为什么需要它,但我发现另一个问题。当我按回车键时,似乎创建了新行,但插入符号仍停留在同一行上,如果您输入任何其他文本,则会出现在第一行上。如果我注释掉使用...我就可以恢复一切。有什么想法吗? - Demarsch
@Demarsch 我无法重现那个问题。我的光标会移动到下一行。 - LarsTech
@LarcTech 不用在意,这是我的错误,我手动移动了选择来识别特定字符使用的字体。再次感谢。 - Demarsch
所有的解决方案,包括这个和我链接的那个,最终都会在文本上面进行绘制。你有没有找到任何方法可以在文本后面进行绘制?即只绘制背景? - Tombala

2
富文本框中的事件很麻烦,因为它们不会按照你期望的方式触发。在这篇帖子中,有人发布了所需的最小代码,通过托管富文本框并拦截Windows绘图请求来公开适当的绘图事件。它是用VB.Net编写的,但应该很容易将其翻译为您的使用。

谢谢,看起来可以用。如果你需要的话,这里有一个在线代码转换器http://www.developerfusion.com/tools/convert/vb-to-csharp/。 - Demarsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接