私は自分で楽しむために画像エディタを作成していますが、最後に行ったペイントを元に戻すための元に戻すボタンをどのように作成できるのでしょうか。私はこれについてどうするか知りたいのですが、チュートリアルやサンプルコードがいいか、少なくとも私を正しい方向に向けてくれるものになるでしょう。
ありがとう!
私は自分で楽しむために画像エディタを作成していますが、最後に行ったペイントを元に戻すための元に戻すボタンをどのように作成できるのでしょうか。私はこれについてどうするか知りたいのですが、チュートリアルやサンプルコードがいいか、少なくとも私を正しい方向に向けてくれるものになるでしょう。
ありがとう!
思ったほど難しくなく元に戻せます。ここでの魔法は、各アクションをリストまたはキューに描画されるオブジェクトとして記録する必要があるということです。たとえば、ユーザーが線を引くと、レコードは開始点の x、y、および終了点の x、y のように見えます。メソッド Draw() を持つオブジェクト自体であるため、元に戻す操作はそのオブジェクトを削除するだけです。
次のようなコードで:
interface IDrawObject
{
public void Draw();
}
class Line : IDrawObject
{
private Point _startP;
private Point _endP;
public Line(Point startPoint; Poing endPoint)
{
_startP = startPoint;
_endP = endPoint;
}
public void Draw()
{
//* call some generic draw processor to perform the action with your given parameters.
}
}
class Rectangle : IDrawObject
{
//* your code.
public void Draw()
{
//* call some generic draw processor to perform the action with your given parameters.
}
}
//* then in your code, you could have something like this.
List<IDrawObject> myObjectsINeedToDraw = new List<IDrawObject>();
myObjectsINeedToDraw.Add(new Line(new Point(0, 0), new Point(10, 10));
foreach(IDrawObject objectToDraw in myObjectsINeedToDraw)
{
//* will draw your object.
objectToDraw.Draw();
}
//* in this way you will have unlimited history of your objects, and you will always can remove object from that list.
http://en.wikipedia.org/wiki/Command_pattern
コマンドオブジェクトは、以下を実装するのに役立ちます。
マルチレベルの取り消しプログラム内のすべてのユーザーアクションがコマンドオブジェクトとして実装されている場合、プログラムは最後に実行されたコマンドのスタックを保持できます。ユーザーがコマンドを元に戻したい場合、プログラムは最新のコマンドオブジェクトをポップし、そのundo()メソッドを実行するだけです。
編集:これがどのように役立つかを概観するためにこれを解決する場合、ユーザーがコマンドとして線を引くなどの各「アクション」を記録し、そのアクションの完了に関するすべての関連情報を内部に保存します。描画コンテキストに適用する前に、そのコマンド。
したがって、すべてのアクションがスタックにプッシュされるため、アイテムをポップバックできます。
速度を上げるために、一連のアクションの描画オブジェクトの状態を記録するようなものも検討します。これは描画のコンテキストであるため、既知の描画状態から開始し、コマンドを再適用して現在のバージョンを作成する方がおそらく簡単です。
したがって、例として、コマンドの実行スタックと描画オブジェクトの実行スタックがあります。5つのコマンドごとに、描画オブジェクトの状態をスタックにプッシュします。したがって、ユーザーが[元に戻す]を押すと、描画オブジェクトの最上位の状態を取得し、最後のコマンドを除いて最新のコマンドをオブジェクトに適用します。10個のアクションを元に戻すには、描画オブジェクトの2つの状態に戻り、新しいコマンドを適用する必要はありません。
プログラムで実行できるundo/redo状態の深さを制限することをお勧めします。そうしないと、メモリ内で無限に大きくなります。
基本的な方法の 1 つは、作成するすべての新しいブラシ ストロークを保持するスタックを保持することです。
元に戻すボタンを押すと、スタックがポップオフされ、変更が元に戻されます (アプリの仕様によって異なりますが、背景色を再描画することで購入できます)。