• ベストアンサー

C++Builderでペイントソフト

C++Builder6でペイントソフトを作成しています。 そこで,UNDOを実装したいのですが, どのように作成したらよいのか分かりません。 色々と調べてみたのですが,あまりヒットしませんでした。 参考になるサイトなどがありましたら教えて頂けませんか。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

UNDO処理は、メモリを使ってゴリゴリとコーディングするしかありません。 基本は「何かを書き換える時は、書き換え前の状態をメモリに退避しておいてから、書き換えを行う。UNDOで元に戻す時は、メモリに退避した物を元の場所へ書き戻す」です。 具体的には、以下のようにコーディングする事になります。 ・通常の状態では 1.ユーザーがキャンパスを書き換えるアクションを行おうとした場合は、書き換え前のキャンパスの全内容をメモリに退避する。 2.その後、ユーザーが行ったアクションをキャンパスに反映させる。 3.UNDOが可能な状態にする。 ・UNDOを行われたら 1.退避しておいたメモリ内容をキャンパスに戻す。 2.キャンパスを元に戻す以外の「つじつま合わせ」もする。 3.UNDO出来ない状態にする。 何を何処にどう退避させるかは、それぞれのソフトの作り方次第なので、これと言った決まりはありません(つまり「何を何処にどう退避させれば良いの?」と言う質問には回答出来ません) なお、通常の状態でメモリへ退避するのは、毎回ではなく「ペンツールから塗り潰しツールに変えた後とか、違うツールで描画しようとした瞬間」とか「ユーザーが明示的にメモリ退避を行った(メニューに「メモリへ退避」とかの項目を設置しておく)時」の方が良いです。UNDOで1ピクセルだけとか、1アクション分だけしか戻らないんだったら意味が無いので。

noname#78422
質問者

お礼

構造がよく分かりました。 ありがとうございました。

その他の回答 (2)

回答No.3

> draw系とpaint系では処理が違うのですか? draw系では絵そのものではなく、操作、たとえば "太さ3の赤いペンで(0,0)から(20,40)に線を引く" なんてのを順に記憶しておきます。 ですから最後の操作を削除し、最初から操作の列を再現することでUNDOが実現できます。

noname#78422
質問者

お礼

そうなんですか! 分かりました。 ありがとうございます。

回答No.2

> 基本は「何かを書き換える時は、書き換え前の状態をメモリに退避しておいてから、書き換えを行う。UNDOで元に戻す時は、メモリに退避した物を元の場所へ書き戻す」です。 paint系はそうかも知れんけど、draw系であれば'操作の並び'を記憶しておけばいい。

noname#78422
質問者

お礼

draw系とpaint系では処理が違うのですか?