Synchrones und asynchrones Zeichnen

Die meisten Zeichnungen, die während der Verarbeitung der WM_PAINT Nachricht ausgeführt werden, sind asynchron. Das heißt, es gibt eine Verzögerung zwischen dem Zeitpunkt, zu dem ein Teil des Fensters ungültig ist, und dem Zeitpunkt, zu dem WM_PAINT gesendet wird. Während der Verzögerung ruft die Anwendung in der Regel Nachrichten aus der Warteschlange ab und führt andere Aufgaben aus. Der Grund für die Verzögerung ist, dass das System das Zeichnen in einem Fenster im Allgemeinen als Vorgang mit niedriger Priorität behandelt und so funktioniert, als ob Benutzereingabemeldungen und Nachrichten, die sich auf die Position oder Größe eines Fensters auswirken können, vor WM_PAINT verarbeitet werden.

In einigen Fällen ist es erforderlich, dass eine Anwendung synchron zeichnet, d. h. im Fenster direkt nach dem Ungültigstellen eines Teils des Fensters zeichnen. Eine typische Anwendung zeichnet ihr Standard Fenster unmittelbar nach dem Erstellen des Fensters, um dem Benutzer zu signalisieren, dass die Anwendung erfolgreich gestartet wurde. Das System zeichnet einige Steuerungsfenster synchron, z. B. Schaltflächen, da diese Fenster als Fokus für Benutzereingaben dienen. Obwohl jedes Fenster mit einer einfachen Zeichnungsroutine synchron gezeichnet werden kann, sollte diese Zeichnung schnell erfolgen und sollte die Fähigkeit der Anwendung, auf Benutzereingaben zu reagieren, nicht beeinträchtigen.

Die Funktionen UpdateWindow und RedrawWindow ermöglichen synchrones Zeichnen. UpdateWindow sendet eine WM_PAINT-Nachricht direkt an das Fenster, wenn der Updatebereich nicht leer ist. RedrawWindow sendet auch eine WM_PAINT Nachricht, gibt der Anwendung jedoch eine bessere Kontrolle darüber, wie das Fenster gezeichnet werden soll, z. B. ob der Nichtclientbereich und der Fensterhintergrund gezeichnet werden soll oder ob die Nachricht gesendet werden soll, unabhängig davon, ob der Updatebereich leer ist. Diese Funktionen senden die WM_PAINT Nachricht unabhängig von der Anzahl anderer Nachrichten in der Anwendungsnachrichtenwarteschlange direkt an das Fenster.

Alle Fenster, die zeitaufwendige Zeichnungsvorgänge erfordern, sollten asynchron gezeichnet werden, um zu verhindern, dass ausstehende Nachrichten beim Zeichnen des Fensters blockiert werden. Außerdem sollte jede Anwendung, die häufig kleine Teile eines Fensters ungültig macht, zulassen, dass diese ungültigen Teile in eine einzelne asynchrone WM_PAINT Nachricht konsolidiert werden können, anstatt eine Reihe synchroner WM_PAINT Nachrichten.