un problema en la aplicación de deshacer / rehacer
Pregunta
Tengo un problema con mi código
después de que haga clic en Deshacer no puedo dibujar sobre la imagen y no sé por qué
Este es mi código
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
Solución
Esto se debe a que está creando un objeto Graphics para un objeto de mapa de bits específica. Sólo se puede utilizar eso para disponer de dicho mapa de bits específica, cada vez que cambie el mapa de bits con uno de la de deshacer, todavía se está dibujando en el mismo mapa de bits, pero que uno no se muestra más.
En lugar de crear un objeto Graphics y aferrándose a ella, crear uno para el mapa de bits actual cuando lo necesite, y disponer de ella después:
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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow