我使用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()
函数对表单进行任何设置。
答案 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窗体编程中覆盖默认行为的强大方法。
如果您需要其他帮助,请与我们联系。