我试图在VB.NETPictureBox
上绘制多条线,而不删除以前的更改。如果我尝试在e.graphics
的不同时间在PictureBox
上画两条线,那么它会删除以前的线/更改。
我正在PictureBox
的paint
事件中使用此代码。
Public Class DrawLine
Dim point1X As Integer = 10
Dim point1Y As Integer = 10
Dim point2X As Integer = 50
Dim point2Y As Integer = 50
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
Dim pt As New Point(point1X, point1Y)
Dim pt1 As New Point(point2X, point2Y)
e.Graphics.DrawLine(Pens.Green, pt, pt1)
End Sub
End Class
此示例完美地在PictureBox
内部绘制了一条绿线。
但是,当我有一个按钮在表单绘制完成后在PictureBox
上绘制另一条线时,上一条绘制的线将消失。
例如,如果我有一个像这样的函数,它画另一条线
Private Function DrawAnotherLine(xPos1 As Integer, yPos1 As Integer, xPos2 As Integer, yPos2 As Integer)
point1X = xPos1
point1Y = yPos1
point2X = xPos2
point2Y = yPos2
PictureBox1.Invalidate()
End Function
它删除绘制的第一条线,只绘制第二条线。我希望它在第一行的顶部画第二行,而不仅仅是删除第一行,我该怎么做?
(注意:我不能在函数中包括绘制第一条线,因为这个函数将在已经绘制的线之上多次使用(。
GDI+绘图非常简单:
- 声明一个或多个字段以存储表示图形的数据
- 处理要绘制的控件的
Paint
事件 - 在步骤2中的事件处理程序中,从步骤1中声明的字段中获取数据并执行绘图
- 要更改图形,请修改步骤1中声明的字段,并调用控件上的
Invalidate
如果你想画多条线,那么你首先需要一个代表一条线的数据结构,然后在某个地方存储该数据结构的多个实例。最明显的方法是定义一个包含单行数据的类或结构,例如
Public Class Line
Public ReadOnly Property StartPoint As Point
Public ReadOnly Property EndPoint As Point
Public Sub New(startPoint As Point, endPoint As Point)
Me.StartPoint = startPoint
Me.EndPoint = endPoint
End Sub
End Class
然后声明一个引用该类型集合的字段:
Private lines As New List(Of Line)
然后,Paint
事件处理程序绘制集合中的所有行:
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
For Each line In lines
e.Graphics.DrawLine(Pens.Black, line.StartPoint, line.EndPoint)
Next
End Sub
要绘制一条新线,您可以将一个新的Line
对象添加到集合中,并将Invalidate
添加到控件中:
Private Sub AddNewLine(startPoint As Point, endPoint As Point)
lines.Add(New Line(startPoint, endPoint))
PictureBox1.Invalidate()
End Sub
你如何获得这些分数取决于你自己。您可以在MouseDown
事件中记录位置,然后在MouseUp
事件中调用AddNewLine
,也可以完全执行其他操作。
调用Invalidate
时最好指定尽可能小的区域,但这超出了本问题的范围。