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