如何在VB.NET中画一条线

N.T*_*T.C 4 .net vb.net pen winforms

我试图用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
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 9

基本上,你做错了就是使用这个CreateGraphics方法.

这是你很少需要做的事情.当然,这并不是说方法被破坏了.它完全按照它所说的做法:记录为:返回Graphics表示表单绘图表面的对象.

问题是,无论何时重新绘制表单(这可能由于很多原因而发生),Graphics对象基本上都会被重置.因此,您所获得的所有内容都将被删除.

表单在首次加载时总是重绘,因此在事件处理程序方法中使用CreateGraphics 永远不会有意义Load.它也会在任何时候被重新绘制,最小化和恢复,被另一个窗口覆盖,甚至调整大小(其中一些取决于您的操作系统,图形驱动程序和表单的属性,但这超出了这一点).

你可以使用的唯一时间CreateGraphics是当你想显示即时反馈给用户不应该跨越重绘坚持.例如,在MouseMove事件的处理程序中,显示拖放的反馈.

那么,解决方案是什么?始终在Paint事件处理程序方法中进行绘图.这样,它会持续重绘,因为"重绘"基本上涉及提升Paint事件.

当Paint引发事件,处理程序是通过实例PaintEventArgs类,它包含了一个Graphics对象,你可以画成.

所以这是你的代码应该是什么样子:

Public Class Form1

    Protected Overridable Sub OnPaint(e As PaintEventArgs)
        ' Call the base class
        MyBase.OnPaint(e)

        ' Do your painting
        e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

(另请注意,在上面的代码中,我重写了该OnPaint方法,而不是处理相应的Paint事件.这被认为是处理派生类中事件的最佳实践.但无论哪种方式都可行.)