C#でお絵かきソフトを作成しています。
undo,redo機能を実装したいのですが取り掛かりがわからずに困っております。
いろいろと調べてみたのですがどのようにコードを組み込めばよいのかがわかりません。
よろしくお願いいたします。
現在、自由線描画、直線描画、全消去、保存、読み込み機能があります。
マウス操作の前後でundo,redoを行いたいと思っております。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
こんにちわ
undo/redo を実装するなら、スタンダードかどうかわかりませんが、僕の方法をつたえます。
ツール関連の処理で実装するなら、ドットを打つ、という動作をコマンドとして実装しましょう。
そうすれば、コマンドのログを取っていればundo/redoは簡単にできると思います。
他にも、ラインを引くなど、基本的な機能はコマンドにして、それのログを取って戻れるようにすれば
実装できるとおもいます。もちろん、コマンドとともに変更前のデータも保存しないとダメですが。
そこは工夫して保持するデータを考えてみてください。
あ、データの保存は「スタック」します。
この言葉が判らない場合は、ググってください。
投稿2016/06/04 18:21
編集2016/06/04 18:23総合スコア1046
0
例えばIUndoableと言うインターフェースを作成します。
これはDoメソッドとUndoメソッドを持ちます。
そして直線を引くためのDrawLineオブジェクトを作成します。これは上記インターフェースを実装します。
上記オブジェクトのDoメソッドを呼ぶと、描画すべき位地の現在の画像を切り取って保存し、その上で直線を描画します。
メモリ使用量を少なくしようと思えば本当に必要な部分だけ保存するよう工夫が必要ですが、取りあえず直線を含む最小の長方形を保存するのが一番簡単ですので、まずはそれで組み立てていくといいでしょう。
そしてUndoメソッドを呼ぶと、保存した元の画像を描画します。
このようなオブジェクトを描画タイプの数だけ用意します。
スタックを二つ用意し、片方をアンドゥスタック、片方をリドゥスタックとします。
ユーザーの指令で描画するときにはリドゥスタックをクリアし、オブジェクトのDoメソッドを呼んでアンドゥスタックにプッシュします。
アンドゥするときにはアンドゥスタックからオブジェクトをポップし、Undoメソッドを呼び、リドゥスタックにプッシュします。
リドゥするときにはリドゥスタックからポップし、Doメソッドを呼び、アンドゥスタックにプッシュします。
投稿2016/06/04 05:02
総合スコア28673
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
デザインパターン undo redo
で google 検索すると、いろいろ情報が得られるとおもいます。
検索結果例:
-
Undo,Redoの実装って何十回もやってる気がする http://d.hatena.ne.jp/Youchan/20081110/1226282911
-
ふと GoF のデザインパターンを再考しておく http://www.moonmile.net/blog/archives/7678
...
Memento
いわゆる、Undo/Redo に使われるパターンなのだが、
...
-
テキストエディタの「戻る(UNDO)」を、複数回可能にしたい https://teratail.com/questions/21231
-
Undo/Redo の話 http://www.principia-m.com/ts/0061/index-jp.html
投稿2016/06/03 13:19
総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。