views:

409

answers:

2

Hi

I have a problem with my code

after I click undo I can't draw on the image and I don't know why

this is my code

Imports System.Drawing.Graphics
Imports System.Drawing.Bitmap
Imports System.Drawing
Public Class FrmChild
    Dim Xstart As Short
    Dim Ystart As Short
    Dim Xend As Short
    Dim Yend As Short
    Dim BoolErasing As Boolean = False
    Dim BoolDrawing As Boolean = False
    Dim Image As New Bitmap(1500, 1200)
    Public GraphFun As Graphics = Graphics.FromImage(Image)
    Dim ErasingPen As New Pen(Drawing.Color.White, 3)
    Dim DrawingPen As New Pen(Drawing.Color.Black, 3)
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        undo.Push(Image.Clone())
        redo.Clear()
        btnredo.Enabled = False
        If Not btnundo.Enabled Then btnundo.Enabled = True
        Xstart = e.X
        Ystart = e.Y
        If btnEraser Then
            BoolErasing = True
        ElseIf btnPencil Then
            BoolDrawing = True
        End If
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If BoolErasing Then
            GraphFun.DrawLine(ErasingPen, Xstart, Ystart, e.X, e.Y)
        ElseIf BoolDrawing Then
            GraphFun.DrawLine(DrawingPen, Xstart, Ystart, e.X, e.Y)
        End If
        Xstart = e.X
        Ystart = e.Y
        PictureBox1.Image = Image
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        Xend = e.X
        Yend = e.Y
        BoolErasing = False
        BoolDrawing = False
        PictureBox1.Image = Image
    End Sub


    Private Sub Btnundo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnundo.Click
        If Not btnredo.Enabled Then btnredo.Enabled = True
        redo.Push(Image.Clone())
        Image = undo.Pop()
        PictureBox1.Image = Image
        If undo.Count = 0 Then
            btnundo.Enabled = False
        End If
    End Sub


    Private Sub FrmChild_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        btnundo.Enabled = False
        btnredo.Enabled = False
    End Sub

    Private Sub btnredo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnredo.Click
        If Not btnundo.Enabled Then btnundo.Enabled = True
        undo.Push(Image.Clone())
        Image = redo.Pop()
        PictureBox1.Image = Image
        If redo.Count = 0 Then btnredo.Enabled = False
    End Sub
End Class
+1  A: 

That's because you are creating a Graphics object for a specific Bitmap object. You can only use that to draw on that specific bitmap, when you replace the bitmap with one from the undo, you are still drawing on the same bitmap, but that one is not displayed any more.

Instead of creating a Graphics object and holding on to it, create one for the current bitmap when you need it, and dispose of it afterwards:

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
   Using graphFun As Graphics = Graphics.FromImage(Image)
      If BoolErasing Then
         GraphFun.DrawLine(ErasingPen, Xstart, Ystart, e.X, e.Y)
      ElseIf BoolDrawing Then
         GraphFun.DrawLine(DrawingPen, Xstart, Ystart, e.X, e.Y)
      End If
   End Using
   Xstart = e.X
   Ystart = e.Y
   PictureBox1.Image = Image
End Sub
Guffa
A: 

www.undomadeeasy.com has a free manual that discusses multiple undoing and redoing of graphics in general. It might help.

Regards CarlWarman

Carl Warman