vb.net - 如何清除 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
解决方案
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)。
推荐阅读
- reactjs - 带有钩子的 redux-saga 不起作用,钩子调用无效
- knockout.js - 在 ObservableArray 中查找参数的索引 - KnockoutJS
- rust - 在 Rust 中的线程之间共享函数引用
- matlab - “拟合”方程的拉普拉斯变换
- node.js - GCP 云上的长时间运行作业
- postgresql - Postgres - jsonb:使用从另一个表中获取的值更新列中的键
- jenkins - Jenkins ssh 代理插件越来越多,没有错误,没有超时问题
- arrays - 在excel中查找多列并求和它们的值
- javascript - 使用 Vuetify 数据表 + 带有模板的单选道具时出现问题
- android - 如何访问有状态小部件列表的状态对象的方法?(扑)