Vb.net 从PictureBox获取位图-对象的新实例

Vb.net 从PictureBox获取位图-对象的新实例,vb.net,winforms,graphics,picturebox,Vb.net,Winforms,Graphics,Picturebox,我有一个“完美”的工作代码,可以将屏幕的一部分放入方形图片盒中。 我有一个“完美无瑕”的工作代码,可以用笔在画框上画画。 我完全不明白,为什么我不能让笔在图片盒中的位图上画画-它只在灰色背景上画画。 该解决方案(也按照谷歌的说法)看似简单,但任何试图从PictureBox获取gg图形的方法都会导致(“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误为:值不能为null。 参数名称:image和“使用'New'关键字创建对象的新实例…”) 我认为问题在于我

我有一个“完美”的工作代码,可以将屏幕的一部分放入方形图片盒中。
我有一个“完美无瑕”的工作代码,可以用笔在画框上画画。
我完全不明白,为什么我不能让笔在图片盒中的位图上画画-它只在灰色背景上画画。
该解决方案(也按照谷歌的说法)看似简单,但任何试图从PictureBox获取gg图形的方法都会导致(“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误为:值不能为null。 参数名称:image和“使用'New'关键字创建对象的新实例…”)

我认为问题在于我将位图定义为sub之外的私有位图,但我无法理解正确的概念

Private bit As New System.Drawing.Bitmap(250, 250)
Private gg As Graphics = Graphics.FromImage(Me.PictureBox1.Image)
'            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'            ^^^^^^^^^^ HERE IS THE PROBLEM ^^^^^^^^^^^^^^^^^^^^^^
'            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Private br As New Pen(Color.Red)
Private dwn As Boolean
Private lst As Point
Private firstrun As Boolean = True
Dim Tloustka As Integer = 10
Dim Barva As Integer

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    'gg = Graphics.FromImage(Me.PictureBox1.Image)
    dwn = True
End Sub


Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    If dwn = True Then
        Dim s As Integer
        Dim xy As Point
        Dim br2 As New SolidBrush(Color.FromName("White"))
        s = Tloustka
        br.Color = Color.FromName("White")
        br.Width = Tloustka
        xy.X = e.X
        xy.Y = e.Y
        If firstrun = True Then
            lst = xy
            firstrun = False
        End If
        gg.FillEllipse(br2, xy.X - CLng(s / 2), xy.Y - CLng(s / 2), s, s)
        gg.DrawLine(br, lst, xy)
        lst = xy
        PictureBox1.Image = bit
    End If
End Sub

etc. etc. etc.

不要存储图形对象。当您需要绘制某些内容时,只需从位图创建它:

Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
  If dwn = True Then
    Using g As Graphics = Graphics.FromImage(bit)
      Dim s As Integer
      Dim xy As Point
      Using br2 As New SolidBrush(Color.FromName("White"))
        s = Tloustka
        br.Color = Color.FromName("White")
        br.Width = Tloustka
        xy.X = e.X
        xy.Y = e.Y
        If firstrun = True Then
          lst = xy
          firstrun = False
        End If
        g.FillEllipse(br2, xy.X - CLng(s / 2), xy.Y - CLng(s / 2), s, s)
        g.DrawLine(br, lst, xy)
      End Using
    End Using
    lst = xy
    PictureBox1.Invalidate()
  End If
End Sub
然后使用PictureBox的paint事件显示图像:

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
  e.Graphics.DrawImage(bit, Point.Empty)
End Sub

请务必处理好图形对象。

以上所有代码似乎都有点太复杂了。就我而言,最简单的方法是如下所示:

将bm设置为位图 带PictureBox1 bm=新位图(.Width,.Height) PictureBox1.DrawToBitmap(bm,新矩形(0,0,、宽度和高度)) 以

/印刷代码/

处置


备注:任何控件都可以绘制到位图。

删除“位”。完成绘制后,调用PictureBox1.Invalidate(),以便它知道需要重新绘制图像。谢谢,这是一个完美的答案,它完全解决了我的问题!祝您有个美好的一天!