4

我正在尝试用 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
4

5 回答 5

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

(还要注意,在上面的代码中,我重写了OnPaint方法,而不是处理相应的Paint事件。这被认为是在派生类中处理事件的最佳实践。但任何一种方式都可以。)

于 2013-07-27T08:11:16.540 回答
2

你应该这样做来画你的线

Public Class Form1
    Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    Dim myPen As Pen

   'instantiate a new pen object using the color structure
    myPen = New Pen(Color=Color.Blue, Width=2)

   'draw the line on the form using the pen object
   e.Graphics.DrawLine(pen=myPen, x1=100, y1=150, x2=150, y2=100)

   End Sub       
End Class

或者有更简单的解决方案只是在表单绘制事件中添加此代码

e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)
于 2014-07-11T07:33:25.237 回答
1

您应该将此代码放在Paint表单的事件中,这里发生的是正在绘制线条,但是在完成加载时表单正在重新绘制,因此您的线条消失了。此外,请尝试使用黑色或更具对比色的颜色,否则您会错过它与窗体的窗口背景颜色的对比。

于 2013-07-27T08:09:07.543 回答
0

您可以通过向窗体添加一个 groupbox 控件来实现此目的。然后删除文本(保留空白文本),将高度设置为 1 并选择所需的背景颜色。

于 2014-05-13T09:21:59.383 回答
0

绘制多条线 Dim blackPen As New Pen(Color.Red, 3) Dim hwnd As IntPtr = PictureBox1.Handle Dim myGraphics As Graphics myGraphics = Graphics.FromHwnd(hwnd) Dim x1 As Integer = 100 Dim x2 As Integer = 500 Dim y1 As Integer = 10 Dim y2 As Integer = y1 Dim i As Int16 = 10, bothgap As Int16 = 20 ' myGraphics.DrawLine(blackPen, x1, y1, x2, y2) For i = 1 To 10 myGraphics.DrawLine(blackPen, x1, y1 + i * bothgap, x2, y1 + i * bothgap) 'myGraphics.DrawLine(blackPen, x1, y1 + 2 * 20, x2, y1 + 2 * 20) 'myGraphics.DrawLine(blackPen, x1, y1 + 3 * 20, x2, y1 + 3 * 20) 下一个 x1 = 100 x2 = 100 y1 = 10 + bothgap y2 = 200 + bothgap / 2 blackPen = New Pen(Color.Blue,3) For i = 1 To 21 ' myGraphics.DrawLine(blackPen, x1, y1, x2, y2) myGraphics.DrawLine(blackPen, x1 + (i - 1) * bothgap, y1, x2 + (i - 1) * bothgap , y2) ' myGraphics.DrawLine(blackPen, x1 + 2 * bothgap, y1, x2 + 2 * bothgap, y2)

于 2019-12-20T06:50:56.293 回答