我正在编写一个简单的测试程序,它在一个表单中绘制一个轴/十字准线。我有两个文本框,我放在x-center和y-center中,然后根据它绘制十字准线。我希望能够放入新坐标,并将十字准线移动到新位置,但是当我这样做时,旧绘图就会停留在那里。我想删除旧图纸,然后绘制新图纸。
我的代码如下:
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
答案 0 :(得分:0)
控制界面上的绘图通常通过控件的Paint()事件使用其PaintEventArgs类对象进行处理。
要引发Control的Paint()事件,请调用其Invalidate()方法
(请注意,Invalidate()
方法有许多重载,其中一些允许仅重新绘制表面的已定义区域。)
如果在其他地方创建了Graphics对象(正如您现在所做的那样),使用此对象执行的绘图将会保留或在您不想要时将被删除(例如,如果控件需要重绘本身 - 这种情况经常发生 - 图纸将被删除)
此外,无法存储Graphics对象。一旦控件重新绘制其表面,它将成为无效对象。
您可以通过这种方式重新设计代码。
Graphics.DrawLine()
移至表单的Paint事件。Dispose()
Pen对象(您可以使用它的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)。