WM_PAINTと無効なリージョン

今回はWM_PAINTの動作についてのお話です。

・無効な領域

一般的に、プログラムはウィンドウ内のクライアント領域(リージョン)に画像を描画します。
そして、ウィンドウへの操作などによって、ウィンドウが隠された時
windowsはその隠された部分に描かれた内容を保証してくれません。
(その部分に描かれていた内容は消えてしまいます)
これにより、ウィンドウ内に無効な領域(リージョン)が出来てしまうわけですが
windowsは無効な領域が出来ると「WM_PAINT」メッセージをキューにポストしてくれます。
つまり「消えた部分が出来たのを教えるから後は自分でなんとかしろ」というわけですね。
そこで、プロシージャのWM_PAINTイベント内で描画処理を行うことになるわけです。

・BeginPaint~EndPaint

描画の流れを軽く説明します。

          case WM_PAINT:
               hdc = BeginPaint(hwnd, &paint);
               ……
               EndPaint(hwnd, &paint);
               return 0;

まずBeginPaintにより、画像を描画しますよという宣言を行います。
(第一引数にはハンドルを、第二引数にはPAINTSTRUCT構造体を指定します)
戻り値として、ウィンドウへの描画を行う際に必要な
デバイスコンテキストのハンドルを得ることが出来ます。
このデバイスコンテキストのハンドルを使って画像などを描画します。
描画が終われば、EndPaintにより「描画が終了しました」というサインを出し
デバイスコンテキストを解放するわけです。

BeginPaintは無効な領域がある時、作成したウィンドウクラスの背景に登録してある
ブラシの色で、無効領域を塗りつぶしてくれるみたいです。
(何も描画処理をしていない場合でもBeginPaintとEndPaintを入れないと
 このWM_PAINTがポストされ続けてしまうらしいです。)

・DefWindowProc

また、補足になりますが

     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

でDefWindowProcにそのままメッセージを渡した場合も
BeginPaintとEndPaint処理をを代わりに行ってくれ
同じように、作成したウィンドウクラスの背景に登録してある
ブラシの色で無効領域を塗りつぶしてくれます。

InvalidateRect

2005/5/15


戻る