在更新区域中重绘

可以通过确定更新区域的大小和位置来限制处理 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 乘 100 矩形内。 在绘制图形之前,窗口过程使用 SetViewportOrgEx 函数将视区原点设置为工作区的不同部分。 这可以防止绘制一个数字到另一个顶部。 更改视区原点不会影响剪切区域,但会影响传递给 RectVisible 的矩形坐标的解释方式。 更改原点还可以使用单个矩形来检查更新区域,而不是每个图形的单个矩形。