【解決方法】ペイント アプリのやり直し機能を実装する


そのため、ピクチャ ボックスに描画しても、アプリケーション ウィンドウが最小化されているときに描画が消えることはありません。 画像ボックスで新しい描画が行われたときに新しいビットマップを追加するスタックがある描画アプリケーションに元に戻す機能を実装しました。 これは、ピクチャ ボックスに表示されている現在のビットマップを、スタックに保持されている以前のビットマップに置き換えることによって、各描画ステップが元に戻されるときに機能します。 やり直し機能を実装する方法がわかりません。元に戻すスタックから削除されているビットマップを新しいやり直しスタックに追加し、ユーザーが Ctrl + Y を押したときにピークするというアイデアがありました。それは一度やり直すのをやめます。 詳細については、以下のコードを確認してください。

私が試したこと:

C#
class MyForm{
    //stack object for holding the redo bitmap states
     private Stack<Bitmap> redoStates = new Stack<Bitmap>();
    //stack object for holding the undo bitmap states
    private Stack<Bitmap> paintStates = new Stack<Bitmap>();
    //ctor
    public MyForm(){
        //this form will receive keyboard events before any other control does
        KeyPreview = true;
        //override on key down event to listen for undo, redo, paste and copy events
        KeyDown += OnKeyDown;
    }
     private void OnKeyDown(object? sender, KeyEventArgs e)
    {

     //check if the user is trying to undo
      if (e.Control && e.KeyCode == Keys.Z)
        {
            //the user is trying to undo the last paint action
            if (paintStates.Count > 0)
            {
                //add this bitmap to the redo stack before removing it
                redoStates.Push(paintStates.Peek());
                //remove the last added bitmap
                paintStates.Pop();
                drawingPanel.Image = paintStates.Peek();
            }
        }
      //check if the user is trying to redo
       if(e.Control && e.KeyCode == Keys.Y)
        {
            //the user is trying to redo the paint events
            //get the object pushed out and display it
            if (redoStates.Count > 1)
            {
                //reverse the redo states
                drawingPanel.Image = redoStates.Peek();
            }
        }
    }
}

解決策 1

ティム、ビットマップを「元に戻す」https://www.codeproject.com/「やり直し」メソッドとして使用しないでください。変更されていない大量のデータを保存する可能性があるため、メモリの観点からは非常に非効率的です!

ある画像から次の画像に移動するために実行したアクションを保存します。物事を変更するたびにそれらをキューに追加します – スピードのために必ずビットマップで実行してください – ただし、ユーザーが元に戻すを使用すると、ビットマップをクリアしてすべてのアクションを繰り返しますその時点まで。

やり直しは難しくありません。元に戻すときは、スタックから最後のアクションを取り、それを 2 番目のスタックにプッシュします。 次に、やり直しはやり直しスタックからのポップであり、元に戻すスタックへのプッシュバックに続いて、画像の再構築が行われます。
ユーザーが新しいアクションを元に戻すスタックに追加すると、やり直しスタックがクリアされます。

コメント

タイトルとURLをコピーしました