アンドゥ、リドゥ 1ピクセル単位で編集できる画像エディタ(6)

アンドゥ、リドゥ 1ピクセル単位で編集できる画像エディタ(6)

アンドゥ、リドゥの機能を追加します。

Undobufクラス

まずアンドゥバッファを管理するUndobufクラスを作成します。ここでかつて使用されていたBitmapを保存しておき、Undo、Redoされたら取り出して使います。

保存するBitmapはPictureBoxUserControlで表示させるものとImageEditPictureBoxで保存するものがあります。一方から他方をつくることも可能ですが、実際に動作させてみると元の画像ファイルが大きいと時間がかかります。そこで最初から2種類つくっておきます。

新しくデータが追加されたらAddメソッドを実行します。すると引数で渡されたデータが現在のデータとなり、それまでCurBitmapに格納されていたデータはUndobufsのなかに格納されます。

Undoメソッドが実行されるとUndobufsのなかに一番最後に格納されていたデータがCurBitmapPairに格納され、それまでCurBitmapPairにあったデータはRedobufsに格納されます。Undobufsが空の時はUndoはできないのでfalseが返されます。

Redoメソッドが実行されるとRedobufsのなかに一番最後に格納されていたデータがCurBitmapPairに格納され、それまでCurBitmapPairにあったデータはUndobufsに格納されます。Redobufsが空の時はRedoはできないのでfalseが返されます。

UndobufクラスのインスタンスをForm1クラスのなかに作成します。またBitmapのペア(PictureBoxUserControl用とImageEditPictureBox用)を格納するためのメソッドもつくっておきます。

画像が編集されたときにUndobufを追加する処理

画像が編集されたときにUndobufを追加する処理が必要です。

ファイルが読み出されたときの処理

一番最初に追加しないといけないのはファイルが読み出されたときです。

Form1クラスでおこなう処理を示します。まずファイルが読み出されたときにおこなわれる処理を示します。これより前に編集されていた画像ファイルがあるかもしれないので、最初にUndobufをクリアします。

次にダブルクリックされたら編集用のフォームを表示させるのですが、このときにPictureBoxUserControlに表示されていたBitmapのコピーとImageEditPictureBoxに表示させるためのBitmapを生成してUndobufに追加します。

この処理がおこなわれるのは新たにファイルが開かれたあと最初に編集用のフォームを表示するときだけです。それ以外のときはすでに存在するUndobufを使います。Undobufが空ならファイルが開かれてから最初に編集用のフォームが表示されるときです(ファイルを開くときにUndobufを空にしたため)。

もうひとつ変更しなければならないのはShowDialogの引数です。Form2クラスからForm1クラスにアクセスできるように引数を渡しておきます。

PictureBoxUserControlに表示されていたBitmapのコピーからImageEditPictureBoxに表示させるためのBitmapを生成するための処理を示します。

画像が編集されたときの処理

画像が編集されたときにUndobufを追加する処理を示します。

画像が編集されたときに実行されるメソッドのなかでやればいいのですが、MouseDownForDrawPointメソッド(点が描画されたとき)、MouseDownForFillConnectedColorメソッド、MouseDownForFillEnclosedAreaメソッド(塗りつぶしの処理)、DrawConfirmedメソッド(それ以外の描画処理が確定したとき)の3つがあります。そこでそれぞれのなかでUndobufを追加する処理をおこないます。

実際にUndo、Redoを実行するための処理

実際にUndo、Redoを実行するためのメソッドもつくっておきます。それから各コントロール内にも取得されたUndobufから画像を復元するためのメソッドもつくります。

これは取得されたUndobufからImageEditPictureBoxに表示させる画像を復元するためのメソッドです。

これは取得されたUndobufからPictureBoxUserControlに表示させる画像を復元するためのメソッドです。

あとはForm2クラスでキー操作をしたときにUndoとRedoの処理ができるようにすれば完成です。