VB.NET中如何清除已绘制线条并更新十字线位置?
嘿,我懂你现在的困扰——每次输入新的中心坐标点击按钮后,旧的十字线总留在窗体上,新的直接叠上去,画面越来越乱对吧?这是因为GDI+的绘图默认是累积叠加的,你得先把旧的内容清掉再画新的才行。下面给你两种实用的解决办法:
解决思路:清除旧绘图再重绘
方法1:直接清除绘图区域
在绘制新十字线之前,调用Graphics.Clear()方法,用窗体的背景色清空整个绘图区域,这样旧的内容就会被覆盖。修改你的按钮点击事件代码如下:
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 获取窗体的绘图对象 Dim g As Graphics = Me.CreateGraphics() ' 用窗体背景色清除所有旧绘图 g.Clear(Me.BackColor) ' 解析输入的坐标(加入验证避免非数字输入报错) Dim centerX As Integer Dim centerY As Integer If Integer.TryParse(TextBox1.Text, centerX) AndAlso Integer.TryParse(TextBox2.Text, centerY) Then Dim mypen As New Pen(Color.Black, 2) ' 绘制十字线 g.DrawLine(mypen, 0, centerY, Me.Width, centerY) ' 水平线 g.DrawLine(mypen, centerX, 0, centerX, Me.Height) ' 垂直线 ' 释放画笔资源 mypen.Dispose() End If ' 释放绘图对象资源 g.Dispose() End Sub End Class
方法2:通过Paint事件持久化绘图(推荐)
如果你的窗体需要在被遮挡、最小化恢复后仍保留十字线,更推荐把绘图逻辑放到窗体的Paint事件里。按钮只负责更新坐标并触发重绘,这样系统会自动帮你处理清除旧内容的工作:
Public Class Form1 ' 用来存储中心坐标的字段,默认值可以自己调整 Private _centerX As Integer = 100 Private _centerY As Integer = 100 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 解析输入的坐标,验证通过后更新字段 If Integer.TryParse(TextBox1.Text, _centerX) AndAlso Integer.TryParse(TextBox2.Text, _centerY) Then ' 触发窗体重绘,会自动调用Paint事件 Me.Invalidate() End If End Sub Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint Dim g As Graphics = e.Graphics Dim mypen As New Pen(Color.Black, 2) ' 绘制十字线 g.DrawLine(mypen, 0, _centerY, Me.Width, _centerY) g.DrawLine(mypen, _centerX, 0, _centerX, Me.Height) mypen.Dispose() End Sub End Class
小提示:第二种方法的优势在于绘图内容是持久的,不管窗体怎么变化,只要触发重绘就会重新画出十字线,不会像第一种方法那样出现内容丢失的情况。
内容的提问来源于stack exchange,提问作者Chris Lampo
相关产品推荐
相关产品推荐

