Vb.net 删除或删除在PictureBox上绘制的矩形
我目前正在解决一个bug,该bug将删除PictureBox上创建的矩形。问题是,当我单击PictureBox上的某个项目并调整windows窗体的大小时,矩形不会随着选定的项目移动。这是创建矩形的代码:Vb.net 删除或删除在PictureBox上绘制的矩形,vb.net,picturebox,Vb.net,Picturebox,我目前正在解决一个bug,该bug将删除PictureBox上创建的矩形。问题是,当我单击PictureBox上的某个项目并调整windows窗体的大小时,矩形不会随着选定的项目移动。这是创建矩形的代码: Private Sub paintRectangle(pictBox As System.Windows.Forms.PictureBox, pic As Image) If pic Is Nothing Then Exit Sub pictBox.Image = pic
Private Sub paintRectangle(pictBox As System.Windows.Forms.PictureBox, pic As Image)
If pic Is Nothing Then Exit Sub
pictBox.Image = pic
If m_rect_x = -1 And m_rect_y = -1 Then
Return
End If
Dim graphic As System.Drawing.Graphics
Dim redselpen As System.Drawing.Pen
Dim yNegative As Integer = 3
redselpen = New System.Drawing.Pen(Color.Blue)
redselpen.DashStyle = Drawing2D.DashStyle.DashDot
If pictBox.Image IsNot Nothing Then
graphic = System.Drawing.Graphics.FromImage(pictBox.Image)
graphic.DrawRectangle(redselpen, m_rect_x, m_rect_y - yNegative, SystemConfig.iRectWidth, SystemConfig.iRectHeight + 2)
pictBox.Image = pictBox.Image
End If
End Sub
调整表单大小后,我想删除在PictureBox上创建矩形的选项
我尝试了这个解决方案,但矩形仍在图片框中
但它不起作用,矩形仍在picturebox中。下面是一个简单的示例,显示picturebox用于绘制可移动和打开/关闭的矩形的Paint()事件:
下面是一个简单的示例,显示PictureBox用于绘制可移动和打开/关闭的矩形的Paint()事件:
问题在于,您没有在
图片盒
上绘制任何内容。您正在绘制一幅图像
,并将其显示在图片框
中。它们是两种不同的东西。在图像
上绘制的任何内容都是该图像
上的永久内容。如果这不是您想要的,则停止在图像上绘制。如果实际绘制的是PictureBox
本身,您可以在其Paint
事件处理程序中进行绘制,那么每个事件都会重新绘制所有内容,因此更改图形非常简单。决定你想要什么,如果你想要后者,改变你的绘画方式。@jmchilinney你提到它是永久的,先生,因为我是在图像上画的。有没有办法撤销它?你明白“永久”是什么意思吗?如果有办法撤销它,那么它就不会是永久的,所以我不会说它是永久的。位图中的每个像素只有一个值。在该位图上绘制某些内容时,会更改这些像素的值。以前的值没有记忆,因此没有什么可撤销的。您可以随时保留原始图像的副本
并重新开始,但这并不能撤销任何内容,我认为这也不需要解释。除非有特殊原因需要在图像上绘制,否则请在控件上绘制。请参见简单示例。重要的是音符。查看形状是如何绘制的,在按住鼠标左键拖动鼠标时如何存储和更新鼠标位置,以及如何将已绘制的形状存储在一组对象中,这些对象可用于跟踪每个形状,并在需要时从集合中删除一个或多个形状。@Jimi谢谢您,先生,我会用它作为参考。问题是你没有在图片盒
上画任何东西。您正在绘制一幅图像
,并将其显示在图片框
中。它们是两种不同的东西。在图像
上绘制的任何内容都是该图像
上的永久内容。如果这不是您想要的,则停止在图像上绘制。如果实际绘制的是PictureBox
本身,您可以在其Paint
事件处理程序中进行绘制,那么每个事件都会重新绘制所有内容,因此更改图形非常简单。决定你想要什么,如果你想要后者,改变你的绘画方式。@jmchilinney你提到它是永久的,先生,因为我是在图像上画的。有没有办法撤销它?你明白“永久”是什么意思吗?如果有办法撤销它,那么它就不会是永久的,所以我不会说它是永久的。位图中的每个像素只有一个值。在该位图上绘制某些内容时,会更改这些像素的值。以前的值没有记忆,因此没有什么可撤销的。您可以随时保留原始图像的副本
并重新开始,但这并不能撤销任何内容,我认为这也不需要解释。除非有特殊原因需要在图像上绘制,否则请在控件上绘制。请参见简单示例。重要的是音符。查看形状是如何绘制的,在按住鼠标左键拖动鼠标时如何存储和更新鼠标位置,以及如何存储在对象集合中已绘制的形状,这些对象可用于跟踪每个形状,并在需要时从集合中删除一个或多个形状。@Jimi谢谢您,先生,我将以此作为参考。
Public Class Form1
Private yNegative As Integer = 3
Private pt As New Nullable(Of Point)
Private drawRectangle As Boolean = False
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
If drawRectangle AndAlso pt.HasValue Then
Using redselpen As New System.Drawing.Pen(Color.Blue)
redselpen.DashStyle = Drawing2D.DashStyle.DashDot
e.Graphics.DrawRectangle(redselpen, pt.Value.X, pt.Value.Y - yNegative, SystemConfig.iRectWidth, SystemConfig.iRectHeight + 2)
End Using
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
pt = New Point(25, 25)
drawRectangle = True
PictureBox1.Invalidate()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
drawRectangle = Not drawRectangle ' toggle the rectangle on/off
PictureBox1.Invalidate()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
pt = New Point(150, 25)
drawRectangle = True
PictureBox1.Invalidate()
End Sub
End Class