Поделиться через


Перерисовка в регионе обновления

Вы можете ограничить объем рисования приложения при обработке сообщения 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. Изменение источника также позволяет использовать один прямоугольник для проверки области обновления, а не отдельных прямоугольников для каждого рисунка.