在更新區域中重繪

您可以藉由判斷更新區域的大小和位置,來限制應用程式在處理 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 之矩形座標的解譯方式。 變更原點也可讓您使用單一矩形來檢查更新區域,而不是每個圖形的個別矩形。