Neuzeichnen in der Updateregion

Sie können die Zeichnungsmenge begrenzen, die Ihre Anwendung beim Verarbeiten der WM_PAINT Nachricht ausführt, indem Sie die Größe und den Speicherort des Updatebereichs bestimmen. Da das System beim Erstellen des Ausschneidebereichs für den Anzeigegerätekontext des Fensters die Updateregion verwendet, können Sie den Updatebereich indirekt bestimmen, indem Sie den Abschneidebereich untersuchen.

Im folgenden Beispiel zeichnet die Fensterprozedur ein Dreieck, ein Rechteck, ein Fünfeck und ein Sechseck, aber nur, wenn sich der gesamte oder ein Teil jeder Abbildung innerhalb des Aktualisierungsbereichs befindet. Die Fensterprozedur verwendet die RectVisible-Funktion und ein 100-mal-100-Rechteck, um zu bestimmen, ob sich eine Abbildung innerhalb des Ausschneidebereichs (und damit des Updatebereichs) für den allgemeinen Gerätekontext befindet, der von BeginPaint abgerufen wird.

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; 
 
  . 
  . 
  . 

Die Koordinaten der einzelnen Abbildungen in diesem Beispiel liegen innerhalb des gleichen Rechtecks von 100 x 100. Vor dem Zeichnen einer Abbildung legt die Fensterprozedur den Viewportursprung mithilfe der SetViewportOrgEx-Funktion auf einen anderen Teil des Clientbereichs fest. Dadurch wird verhindert, dass Figuren übereinander gezeichnet werden. Das Ändern des Viewportursprungs wirkt sich nicht auf den Abschneidebereich aus, sondern wirkt sich darauf aus, wie die Koordinaten des an RectVisible übergebenen Rechtecks interpretiert werden. Wenn Sie den Ursprung ändern, können Sie auch ein einzelnes Rechteck verwenden, um den Aktualisierungsbereich anstelle einzelner Rechtecke für jede Abbildung zu überprüfen.