dポイントプレゼントキャンペーン実施中!

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

A 回答 (3件)

UNDO処理は、メモリを使ってゴリゴリとコーディングするしかありません。



基本は「何かを書き換える時は、書き換え前の状態をメモリに退避しておいてから、書き換えを行う。UNDOで元に戻す時は、メモリに退避した物を元の場所へ書き戻す」です。

具体的には、以下のようにコーディングする事になります。

・通常の状態では
1.ユーザーがキャンパスを書き換えるアクションを行おうとした場合は、書き換え前のキャンパスの全内容をメモリに退避する。
2.その後、ユーザーが行ったアクションをキャンパスに反映させる。
3.UNDOが可能な状態にする。

・UNDOを行われたら
1.退避しておいたメモリ内容をキャンパスに戻す。
2.キャンパスを元に戻す以外の「つじつま合わせ」もする。
3.UNDO出来ない状態にする。

何を何処にどう退避させるかは、それぞれのソフトの作り方次第なので、これと言った決まりはありません(つまり「何を何処にどう退避させれば良いの?」と言う質問には回答出来ません)

なお、通常の状態でメモリへ退避するのは、毎回ではなく「ペンツールから塗り潰しツールに変えた後とか、違うツールで描画しようとした瞬間」とか「ユーザーが明示的にメモリ退避を行った(メニューに「メモリへ退避」とかの項目を設置しておく)時」の方が良いです。UNDOで1ピクセルだけとか、1アクション分だけしか戻らないんだったら意味が無いので。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/07 13:52

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



draw系では絵そのものではなく、操作、たとえば
"太さ3の赤いペンで(0,0)から(20,40)に線を引く"
なんてのを順に記憶しておきます。

ですから最後の操作を削除し、最初から操作の列を再現することでUNDOが実現できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/07 18:52

> 基本は「何かを書き換える時は、書き換え前の状態をメモリに退避しておいてから、書き換えを行う。

UNDOで元に戻す時は、メモリに退避した物を元の場所へ書き戻す」です。

paint系はそうかも知れんけど、draw系であれば'操作の並び'を記憶しておけばいい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/07 13:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!