首页 > 解决方案 > 如何清除 vb.net 中的画线?

问题描述

我正在编写一个简单的测试程序,该程序在表单中绘制轴/十字准线。我有两个文本框,我在其中放置 x 中心和 y 中心,并根据它绘制十字准线。我希望能够输入新坐标,并将十字准线移动到新位置,但是当我这样做时,旧绘图会保留在那里。我想擦掉旧图,然后再画新图。

我的代码如下:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim mypen As Pen
        mypen = New Pen(Drawing.Color.Red, 1)
        Dim mygraphics As Graphics = Me.CreateGraphics
        Dim x_center = Integer.Parse(xPos.Text)
        Dim y_center = Integer.Parse(yPos.Text)
        mygraphics.DrawLine(mypen, x_center - 50, x_center, x_center + 50, x_center)
        mygraphics.DrawLine(mypen, y_center, y_center - 50, y_center, y_center + 50)
    End Sub

End Class

标签: vb.net

解决方案


Control 表面上的绘图通常通过 Control 的Paint()事件,使用它的PaintEventArgs类对象来处理。

要引发控件的 Paint() 事件,请调用其Invalidate()方法。
请注意,该Invalidate()方法有许多重载,其中一些允许仅重新绘制表面的定义区域。

如果在其他地方创建了 Graphics 对象(就像您现在所做的那样),则使用此对象执行的绘图将保留或在您不希望时被删除(例如,如果 Control 需要重新绘制自身 - 这种情况经常发生- 图纸将被删除)。
此外,无法存储 Graphics 对象。一旦控件重新绘制了其表面,它将成为无效对象。

你可以用这种方式重新设计你的代码。

  • 创建一个共享笔(如果需要,您可以随时重新定义它,使用它的属性),这样您就不必在每次需要绘制东西时都创建一个新的。
  • 使用共享点字段来存储图形的当前中心。
  • 将 移至Graphics.DrawLine()Form 的 Paint 事件。
  • 当 Form 关闭时记住Pen 对象(您可以使用它的 Dispose() 预定义方法)。Dispose()


Public Class Form1

    Private mypen As Pen = New Pen(Color.Red, 1)
    Private Position As Point = New Point(-1, -1)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If (Integer.TryParse(xPos.Text, Position.X) = True) AndAlso
           (Integer.TryParse(yPos.Text, Position.Y) = True) Then
            Me.Invalidate()
        End If
    End Sub

    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
        If Position.X > -1 Then
            e.Graphics.DrawLine(mypen, Position.X - 50, Position.Y, Position.X + 50, Position.Y)
            e.Graphics.DrawLine(mypen, Position.X, Position.Y - 50, Position.X, Position.Y + 50)
        End If
    End Sub

End Class

然而,这并没有那么有效,因为您需要使整个表单无效。

如需完整实现,请查看此类(PasteBin - CrossHair)


推荐阅读