Problem with undo / redo implementation
I have a problem with my code
after i canceled undo i cant draw the image and i dont 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
0
a source to share
1 answer
This is because you are creating a Graphics object for a specific Bitmap object. You can only use this to paint on that particular bitmap, when you replace the bitmap with one from undo, you are still drawing the same bitmap, but it is no longer displayed.
Instead of creating a Graphics object and holding it, create it for the current bitmap when you need it, and delete it later:
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
+2
a source to share