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


Вы можете ограничить объем рисования, который Ваше приложение выполняет, обрабатывая сообщение WM_PAINT, устанавливая размер и расположение региона обновления. Поскольку система использует регион обновления, создавая регион отсечения для контекста устройства (DC) отображения окна, Вы можете косвенно определить регион обновления, проверяя регион отсечения.

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

Назад в оглавление
На главную страницу
Переведено 30.01.2011 13:37 ©Copyright V. Sokovikov
Hosted by uCoz