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