[英]VB.NET Drawing Multiple Images onto a PictureBox at Different Locations
[英]VB.NET drawing multiple lines on a PictureBox without removing previous changes
我试图在 VB.NET PictureBox
上绘制多条线,而不删除以前的更改。 如果我尝试在不同时间使用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
上绘制另一条线时,之前绘制的线消失了。
例如,如果我有一个像这样画另一条线的 function
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
它删除绘制的第一条线,只绘制第二条线。 我希望它在第一行之上绘制第二行,而不仅仅是删除第一行,我该怎么做?
(注意:我不能包括在 function 中绘制第一行,因为此 function 将在其已绘制的行之上多次使用)。
GDI+ 绘图非常简单:
Paint
事件。Invalidate
。如果您希望能够绘制多条线,那么您首先需要一个表示单条线的数据结构,然后在某个地方存储该数据结构的多个实例。 最明显的方法是定义一个 class 或包含单行数据的结构,例如
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
object 并使控件Invalidate
:
Private Sub AddNewLine(startPoint As Point, endPoint As Point)
lines.Add(New Line(startPoint, endPoint))
PictureBox1.Invalidate()
End Sub
如何获得这些分数取决于您。 您可以在MouseDown
事件上记录位置,然后在MouseUp
事件上调用AddNewLine
,或者您可以完全执行其他操作。
调用Invalidate
时最好指定可能的最小区域,但这超出了此问题的 scope 范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.