[WM5] Picture Paint たとえばこんな機能追加

Windows Mobile 5.0 アプリケーション開発 Beginner's Book がようやくリリースされました。

Blogでも「買いました」と書いていただいたのをいくつも見つけてうれしく思います。ありがとうございました。

WM5 DevBook 1

本ではいくつかのアプリケーションを作っていますが、あくまで基本的な部分ばかり。まだまだアプリケーションとしては不十分です。そういった部分を機能追加品がら自分なりに作ってみるのも開発の面白さです。


たとえば、第8章 で作っている Picture Paint。ユーザーの操作はすべてBitmapオブジェクトに(プログラム上で)描画して、PaintイベントごとにそのBitmapを画面に描画しています。このアプリケーションにUndo機能を付けようとしたらどうしたらよいでしょう?

現在はBitmapオブジェクトを1つ用意していますが、これを2つ用意して1つ前の状態のBitmapを保存しておけばいいでしょうね。ユーザが描画を開始したら

  1. Bitmap New を Bitmap.old にコピー
  2. Bitmap New に描画
  3. Bitmap New を画面に描画

とすればいいわけです。もしUndoを要求されたら

  1. Bitmap old を Bitmap New にコピー
  2. Bitmap New を画面に描画

とすればOKです。ただしこのままでは1回前の分しか保存できません。そこで、ユーザーが自由にUndoの回数を指定するようにして、そのUndoの回数分だけBitmapオブジェクトを用意すればOKです。

ただしあまりやりすぎるとBitmapオブジェクトの分だけメモリを食ってしまいますね。これではいただけません。こんな場合は、メモリ上に保存するのではなく、ファイルとして保存しておくのも一つの手ですね。

ちなみにこの処理、いったどのタイミングで行ったらいいでしょう?

ペンを動かすごと(Mouse_moveイベント)に行ってしまうと、あまりにも頻繁に発生しすぎます。これではUndoの意味がなくなってしまいます。やはりここは、描画開始、つまりタップを開始する Mouse_downのイベントで 「Bitmap New を Bitmap.old にコピー」する処理を入れてやるといいですね。


今手元にソースコードがないのですが、こんな感じでしょうか?Undomenu というメニューを追加した時のイメージです。

Private undobmp As Bitmap
Private bmp As Bitmap
:
Private Sub Form1_MouseDown( ByVal sender As Object, ....
undobmp = bmp
pos.X = e.X
pos.Y = e.Y
:
Private Undomenu_Click(ByVal sender As Object, ...
bmp = undobmp
Invalidate()

ちょっとの工夫の積み重ねがいいアプリを生むわけですね♪