如何在TextBox上绘制

时间:2010-12-07 15:09:12

标签: c# winforms 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()函数对表单进行任何设置。

2 个答案:

答案 0 :(得分:3)

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

捕获自定义绘图例程需要处理的WM_PAINT消息的最简单方法是继承NativeWindow class

以下是一篇优秀的分步文章,介绍如何在显示红色波浪下划线的情况下执行此操作:Owner-drawing a Windows.Forms TextBox (原始链接已死;由已归档版本替换)功能

答案 1 :(得分:2)

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

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

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

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

如果您需要其他帮助,请与我们联系。