ボタンクラス、インスタンス、メッセージ、マウスイベントとグラフィック描画 -005-
前へ TOPへ 次へ

再描画

次にコンピュータによる描画で不可欠な「再描画」について説明します。

再描画処理

描画処理はWM_PAINTメッセージを受け取ったときに行います。 WM_PAINTメッセージは、アイコン化していたウィンドウを元のサイズに戻したり,前面に他のウィンドウが重なった後、再び元のウィンドウが現れたときなどに発行されます。 つまり、プログラムを実行してウィンドウのクライアント領域に何かを表示し、その上に他のウィンドウが表示されると、クライアント領域の表示内容は失われてしまうため、被覆しているウィンドウが無くなった時点で、クライアント領域の内容を再び描画しなければなりません。 これを再描画といいます。これはWindowsアプリケーションだけでなく、X-WindowやMacintoshなど、他のGUIアプリケーションでも同じことが言えます。 再描画には大きく分けて2つの手法があり、WM_PAINT命令が発行されるたびに再度描き直す方法と、仮想ウィンドウ(裏のウィンドウ)を作成して(CreateCompatiblebitmap関数を使用)描画処理は仮想ウィンドウに行い、再描画のときにビットマップ・イメージを画面すなわち表ウィンドウに転送する(bitblt関数を使用)という方法があり、後者の方法は仮想ウィンドウと実際のウィンドウとの同期が問題となります。 一般的なアプリケーションでは、仮想ウィンドウに描画を行った瞬間に再描画命令を発行する必要があり、このように意図的に再描画命令を発行する関数としてはInvalidateRect()があります。 InvalidateRect()の第2引数はクリッピング領域を指定するもので、実際に再描画が行われる範囲はここで規定される長方形の内部だけになります。この引数をNULLにした場合、画面全体に再描画が行われます。 第3引数は再描画の際に背景色で塗りつぶすかどうかで、TRUEの場合は背景色で塗りつぶします。仮想ウィンドウを生成して、ビットマップ・イメージをコピーする場合にはFALSEで構いませんが(むしろ、ちらつきが無くなるのでこの方がよい)、そうでなければTRUEにすべきです。

アニメーション処理

1フレーム分のグラフィックスを描画した後、そのグラフィックスの内容を少しだけ変えて再度描画する、という処理を連続して行うと、パラパラ漫画のような「動く絵」が作れます。これは仮現運動という目の錯覚(短時間の間に少しずれた絵が続けざまに提示されると、動いたように見えてしまう)を利用した、アニメーションの基本原理です。
そこで、これまでに学んだ再描画処理とInvalidateRect関数(再描画の強制要求)を使ってアニメーションが作れます。具体的には,まずグラフィックスを動かすためのパラメータ変数(これをtとする)をグローバル変数で用意する。

  1. パラメータtを0に初期化しておく。
  2. WM_PAINT のメッセージが降りてきたら,描画手順の手順3.2の中で描画関数にパラメータtを使った引数を入力し,描画関数をコールする。
  3. パラメータtを少しだけ変更する。
  4. InvalidateRect関数をコールする。→ これにより,下記手順5まで抜けてもすぐにまた2に入ってくるようにする。
  5. 描画手順の手順3.3以降を実行する。上記手順4でInvalidateRect関数を呼ぶとき,アニメート領域(動きのある:時間的に変化する領域)が分かっているなら,それを囲む矩形領域のみをクリッピング領域に指定すればアニメーションがスムーズに見える.そうしないとチラツキが発生してしまい,アニメーションにみえなくなってしまうので注意する。

仮想ウィンドウの生成

本授業では必ずしも必須項目ではありませんが、今後Windowsプログラミングをする方のために、仮想ウィンドウの生成方法を書いておきます。 仮想ウィンドウへの描画はWM_PAINT内である必要がないため、任意のタイミングで描画が行えます。 描き込んだ内容を実際のウィンドウに反映させるにはInvalidateRect()を発行します。


前へ TOPへ 次へ