更新リージョンでの再描画

更新領域のサイズと場所を決定することで、 WM_PAINT メッセージを処理するときにアプリケーションが実行する描画の量を制限できます。 システムでは、ウィンドウの表示デバイス コンテキストのクリッピング領域を作成するときに更新領域が使用されるため、クリッピング領域を調べることで、更新領域を間接的に特定できます。

次の例では、ウィンドウ プロシージャは、三角形、四角形、五角形、六角形を描画しますが、各図形のすべてまたは一部が更新領域内にある場合にのみ描画します。 ウィンドウ プロシージャでは 、RectVisible 関数と 100 バイ 100 の四角形を使用して、 BeginPaint によって取得される共通デバイス コンテキストのクリッピング領域内 (つまり更新領域) 内にあるかどうかを判断します。

POINT aptTriangle[4]  = {50,2, 98,86,  2,86, 50,2}, 
      aptRectangle[5] = { 2,2, 98,2,  98,98,  2,98, 2,2}, 
      aptPentagon[6]  = {50,2, 98,35, 79,90, 21,90, 2,35, 50,2}, 
      aptHexagon[7]   = {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2}; 
  . 
  . 
  . 
 
        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ps); 
            SetRect(&rc, 0, 0, 100, 100); 
 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptTriangle, 4); 
 
            SetViewportOrgEx(hdc, 100, 0, NULL); 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptRectangle, 5); 
 
            SetViewportOrgEx(hdc, 0, 100, NULL); 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptPentagon, 6); 
 
            SetViewportOrgEx(hdc, 100, 100, NULL); 
            if (RectVisible(hdc, &rc)) 
                Polyline(hdc, aptHexagon, 7); 
            EndPaint(hwnd, &ps); 
            return 0L; 
 
  . 
  . 
  . 

この例の各図形の座標は、同じ 100 x 100 の四角形内にあります。 図を描画する前に、ウィンドウ プロシージャは SetViewportOrgEx 関数を使用して、ビューポートの原点をクライアント領域の別の部分に設定します。 これにより、図形がもう一方の上に描画されるのを防ぐことができます。 ビューポートの原点を変更してもクリッピング領域には影響しませんが、 RectVisible に渡される四角形の座標の解釈方法には影響します。 原点を変更すると、1 つの四角形を使用して、各図形の個々の四角形ではなく、更新領域をチェックすることもできます。