Vb.net 删除或删除在PictureBox上绘制的矩形

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

我目前正在解决一个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

    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