Win32 Programming: ReDraw

(Hirofumi Fujii (c), 14-July-1998)

Window 画面での描画が複雑な場合、再描画を行うのに memory device context がよく使われる。これは、描画イメージをメモリー上に展開しておき、再描画 は、メモリーから対応する領域をコピーするという手法である。

これを行うには、最初(例えば WM_CREATE message の処理など)に CreateCompatibleDC と CreateCompatibleBitmap を使って memory device context を生成し、WM_PAINT では BitBlt を使って memory device context からコピーする。

大雑把には、次のようなコードになる(このコードでは、memory device context と window のサイズは同じであると仮定している。また、エラーチェックは 一切行っていない)。
  HDC hdc, mdc;
  HBITMAP hbitmap;
  PAINTSTRUCT ps;
  int xsize, ysize;

  case WM_CREATE:
    hdc = GetDC( hwnd );
    mdc = CreateCompatibleDC( hdc );
    hbitmap = CreateCompatibleBitmap( hdc, xsize, ysize );
    SelectObject( mdc, hbitmap );
    PatBlt( mdc, 0, 0, xsize, ysize, WHITENESS );
    ReleaseDC( hwnd, hdc );
    break;

  case WM_PAINT:
    BeginPaint( hwnd, &ps );
    BitBlt( ps.hdc, 0, 0, xsize, ysize, mdc, 0, 0, SRCCOPY );
    EndPaint( hwnd, &ps );
    break;

  case WM_DESTROY:
    DeleteDC( mdc );
    DeleteObject( hbitmap );
    break;