我试图用VB.NET简单地画一条线。
我的代码如下所示,但是当我运行代码时,只显示表单!没有线。
我做错了什么?
Public Class Form1
Dim pen As System.Drawing.Graphics
Private Sub Form1_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
pen = Me.CreateGraphics()
pen.DrawLine(Pens.Azure, 10, 10, 20, 20)
End Sub
End Class
5条答案
按热度按时间kcrjzv8t1#
基本上,你做错的是使用了
CreateGraphics
方法。这是你很少,如果有的话,需要做的事情。当然,这并不是说这个方法被破坏了。它确实做到了它说的:记录如下:返回一个
Graphics
对象,表示窗体的绘图面。问题是,每当你的表单被重绘时(这可能会有很多原因),
Graphics
对象基本上会被 reset。结果是,你所画到你所得到的一切都被抹去了。表单在第一次加载时 * 总是 * 重绘,因此在
Load
事件处理程序方法中使用CreateGraphics
never 是有意义的。它也将在任何时候被最小化和还原,被另一个窗口覆盖,甚至调整大小(其中一些取决于您的操作系统,图形驱动程序,和您的窗体的属性,但这超出了重点)。唯一可能使用
CreateGraphics
的时候是当你想向用户显示 * 不应该 * 在重画中持续存在的 * 即时 * 反馈时。例如,在MouseMove
事件的处理程序中,当显示拖放操作的反馈时。那么,解决方案是什么?**总是在
Paint
事件处理程序方法中进行绘制。**这样,它会在重绘过程中持续存在,因为“重绘”基本上涉及引发Paint
事件。引发
Paint
事件时,处理程序将传递一个PaintEventArgs
类的示例,该示例包含一个可以绘制到其中的Graphics
对象。下面是你的代码 * 应该 * 的样子:
(Note在上面的代码中,我覆盖了
OnPaint
方法,而不是处理相应的Paint
事件。这被认为是处理派生类中事件的最佳实践。但无论哪种方式都能奏效)。r1zhe5dt2#
你应该这样做来划清界限
或者更简单的解决方案是在窗体绘制事件中添加此代码
oyt4ldly3#
你应该把这段代码放在表单的
Paint
事件中,这里发生的事情是,线条正在被绘制,但是表单在完成加载时被重新绘制,所以你的线条消失了。此外,请尝试使用黑色或对比度更高的颜色,否则您会错过它与窗体的窗口背景色的对比。p5cysglq4#
您可以通过向窗体添加groupbox控件来实现这一点。然后删除文本(保持空白文本),将高度设置为1,并选择所需的背景颜色。
brc7rcf05#
绘制多条线