2009-05-14 10 views
0

Ich habe ein Problem mit meinem CodeProblem bei der Implementierung von Undo/Redo

nachdem ich rückgängig machen klicken wir nicht auf dem Bild zeichnen kann, und ich weiß nicht, warum

dies mein 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 

Antwort

2

Das liegt daran, dass Sie ein Graphics-Objekt für ein bestimmtes Bitmap-Objekt erstellen. Sie können das nur verwenden, um auf diese bestimmte Bitmap zu zeichnen, wenn Sie die Bitmap durch eine aus dem Rückgängigmachen ersetzen, zeichnen Sie immer noch auf der gleichen Bitmap, aber diese Bitmap wird nicht mehr angezeigt.

Statt ein Graphics-Objekt zu erstellen und es an halten, erstellen Sie eine für die aktuelle Bitmap, wenn Sie es brauchen, und entsorgen Sie es danach:

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