ピクチャボックスに図形を重ねて描画する への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 せんちゃ  (社会人) 投稿日時 2021/10/8 10:28:40
魔界の仮面弁士様

ありがとうございました!
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/8 09:47:53
> 図2を描くと最初の図1が消えてしまいます。
> PictureBox1.Image = Canvas
額(PictureBox1)に飾っていた 絵画(Button1 で New した Canvas)を、
別の絵画(Button2 で New した Canvas)に差し替えているためです。

> どのように改善したらいいでしょう?
新たな Bitmap を毎回 New するのではなく、
以前描いた Bitmap に対して描画するようにします。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Using g As Graphics = Graphics.FromImage(PictureBox1.Image)
            g.DrawLine(Pens.Red, 100, 100, 200, 200)
        End Using
        PictureBox1.Invalidate()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Using g As Graphics = Graphics.FromImage(PictureBox1.Image)
            g.DrawLine(Pens.Blue, 200, 200, 300, 300)
        End Using
        PictureBox1.Invalidate()
    End Sub
End Class
投稿者 せんちゃ  (社会人) 投稿日時 2021/10/8 09:29:18
Visual Basic2019 vb.netでの質問です。ボタン1を押すと、ピクチャボックスに図1を描画し、その後ボタン2を押すと図2を同じピクチャボックスに描画したいんですが、図2を描くと最初の図1が消えてしまいます。

どのように改善したらいいでしょう?

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

 Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
 Dim g As Graphics = Graphics.FromImage(canvas)

g.DrawLine(Blackpen, 100,100,200,200)

g.Dispose()

PictureBox1.Image = Canvas

End Sub


 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

 Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
 Dim g As Graphics = Graphics.FromImage(canvas)

g.DrawLine(Blackpen, 200,200,300,300)

g.Dispose()

PictureBox1.Image = Canvas

End Sub