如何在TextBox上绘制

我使用TextBox进行winform,我想在它上面绘制一些GDI图形。 文本框没有要挂钩的Paint()事件,所以我假设它必须在表单的Paint事件中发生。 作为测试,我正在从原点到文本框内的位置绘制一个矩形:

  private void FindForm_Paint(object sender, PaintEventArgs e) { using (Pen pen = new Pen(Color.Blue)) { e.Graphics.DrawRectangle(pen, 0, 0, point.X, point.Y); } } 

问题是,当我运行时,首先完成绘图,然后在我的行顶部渲染文本框。 我想在渲染文本框后绘制线条。

PS。 我没有使用Form.SetStyle()函数对表单进行任何设置。

所有者绘制TextBox控件可能相对棘手,因为它只是本机Win32 TextBox控件的包装器。

捕获需要处理的自定义绘制例程的WM_PAINT消息的最简单方法是inheritanceNativeWindow类 。

这是一篇很好的分步文章,展示如何在显示红色波浪下划线的上下文中执行此操作: 所有者绘制Windows.Forms TextBox (原始链接已死;由已归档版本替换)

System.Windows.Forms.TextBox类确实有一个Paint事件: http : //msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.paint.aspx 。 根据MSDN,它不打算在您的代码中使用,但如果您不想使用inheritance创建自己的控件,则可能没有任何其他选项。

如果要在TextBox内部绘制,则应使用其Paint和从其句柄创建的Graphics对象。 如果你甚至使用Form的Paint绘制,当TextBox收到自己的Paint事件时,它将覆盖以前的绘制,因为TextBox位于Form的顶部。

如果您没有使用TextBox的Paint事件,您仍然可以使用CreateGraphics方法获取其Graphics对象。 但是,在TextBox的Paint事件之后,您必须小心处理绘图,否则可能会被覆盖。

最后,您可能需要创建自己的inheritance自TextBox的控件。 inheritance是一种在Windows窗体编程中覆盖默认行为的强大方法。

如果您需要其他帮助,请告诉我。