【问题标题】:Drawing over RichTextBox在 RichTextBox 上绘图
【发布时间】:2026-01-10 15:00:01
【问题描述】:

我正在尝试在 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
    }
}

使用来自this question 的信息对我没有帮助

【问题讨论】:

  • 因为从该示例添加代码后我仍然没有得到文本绘图

标签: c# winforms richtextbox


【解决方案1】:

这对我来说没问题:

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() 行,然后在框中放置足够的文本以开始滚动,看看会发生什么。
  • 嗯,是的,我明白我为什么需要它,但我发现了另一个问题。当我按 Enter 时,它看起来像是创建了新行,但插入符号仍然在同一行,如果您输入任何其他文本,它会出现在第一行。如果我使用...注释掉,我会恢复所有内容。有什么想法吗?
  • @Demarsch 我无法重现。我的插入符号移到下一行。
  • @LarcTech 没关系,这是我的错误,我手动移动选择以识别特定字符使用的字体。再次感谢
  • 所有解决方案,包括这个和我链接到的那个,最终都绘制在文本之上。你有什么方法可以在文字后面画图吗?即只绘制背景?
【解决方案2】:

富文本框中的事件很麻烦,因为它们不会按照您认为应该触发的方式触发。 Here's a post 有人发布了最低要求的代码以拥有一个新控件,该控件通过托管富文本框并拦截 Windows 绘制请求来为您公开正确的绘制事件。它在 VB.Net 中,但应该很容易翻译以供您使用。

【讨论】: