Die WM_PAINT Nachricht

In der Regel zeichnet eine Anwendung ein Fenster als Antwort auf eine WM_PAINT Nachricht. Das System sendet diese Nachricht an eine Fensterprozedur, wenn änderungen am Fenster den Inhalt des Clientbereichs geändert haben. Das System sendet die Nachricht nur, wenn sich keine anderen Nachrichten in der Anwendungsnachrichtenwarteschlange befinden.

Wenn eine WM_PAINT-Nachricht empfangen wird, kann eine Anwendung BeginPaint aufrufen, um den Anzeigegerätekontext für den Clientbereich abzurufen und ihn in Aufrufen von GDI-Funktionen zu verwenden, um die zum Aktualisieren des Clientbereichs erforderlichen Zeichnungsvorgänge auszuführen. Nach Abschluss der Zeichnungsvorgänge ruft die Anwendung die EndPaint-Funktion auf, um den Kontext des Anzeigegeräts freizugeben.

Bevor BeginPaint den Anzeigegerätekontext zurückgibt, bereitet das System den Gerätekontext für das angegebene Fenster vor. Sie legt zunächst den Abschneidebereich für den Gerätekontext so fest, dass er gleich der Schnittmenge des Teils des Fensters ist, der aktualisiert werden muss, und dem Teil, der für den Benutzer sichtbar ist. Nur die Teile des Fensters, die sich geändert haben, werden neu gezeichnet. Versuche, außerhalb dieses Bereichs zu zeichnen, werden abgeschnitten und nicht auf dem Bildschirm angezeigt.

Das System kann auch WM_NCPAINT und WM_ERASEBKGND Nachrichten an die Fensterprozedur senden, bevor BeginPaint zurückgibt. Diese Meldungen weisen die Anwendung an, den Nichtclientbereich und den Fensterhintergrund zu zeichnen. Der Nichtclientbereich ist der Teil eines Fensters, das sich außerhalb des Clientbereichs befindet. Der Bereich enthält Features wie die Titelleiste, das Fenstermenü (auch als Systemmenü bezeichnet) und Bildlaufleisten. Die meisten Anwendungen verlassen sich auf die Standardfensterfunktion DefWindowProc, um diesen Bereich zu zeichnen und daher die WM_NCPAINT Nachricht an diese Funktion zu übergeben. Der Fensterhintergrund ist die Farbe oder das Muster, mit der ein Fenster gefüllt wird, bevor andere Zeichnungsvorgänge beginnen. Der Hintergrund deckt alle Bilder ab, die zuvor im Fenster oder auf dem Bildschirm unter dem Fenster angezeigt wurden. Wenn ein Fenster zu einer Fensterklasse mit einem Klassenhintergrundpinsel gehört, zeichnet die DefWindowProc-Funktion den Fensterhintergrund automatisch.

BeginPaint füllt eine PAINTSTRUCT-Struktur mit Informationen wie den Dimensionen des zu aktualisierenden Fensterteils und einem Flag, das angibt, ob der Fensterhintergrund gezeichnet wurde. Die Anwendung kann diese Informationen verwenden, um die Zeichnung zu optimieren. Sie kann beispielsweise die Dimensionen des Updatebereichs verwenden, die durch den rcPaint-Member angegeben werden, um das Zeichnen auf die Teile des Fensters zu beschränken, die aktualisiert werden müssen. Wenn eine Anwendung über eine sehr einfache Ausgabe verfügt, kann sie den Updatebereich ignorieren und im gesamten Fenster zeichnen, wobei das System alle nicht benötigten Ausgaben verwerfen (ausschneiden) kann. Da das System die Zeichnung mit Clips außerhalb des Beschneidungsbereichs ausklammert, ist nur die Zeichnung sichtbar, die sich im Aktualisierungsbereich befindet.

BeginPaint legt den Updatebereich eines Fensters auf NULL fest. Dadurch wird die Region gelöscht und verhindert, dass nachfolgende WM_PAINT Nachrichten generiert werden. Wenn eine Anwendung eine WM_PAINT Nachricht verarbeitet, aber nicht BeginPaint aufruft oder den Updatebereich anderweitig löscht, empfängt die Anwendung weiterhin WM_PAINT Nachrichten, solange die Region nicht leer ist. In allen Fällen muss eine Anwendung die Updateregion löschen, bevor sie von der WM_PAINT-Nachricht zurückgibt.

Nachdem die Anwendung die Zeichnung abgeschlossen hat, sollte endPaint aufgerufen werden. Bei den meisten Fenstern gibt EndPaint den Kontext des Anzeigegeräts frei und macht ihn für andere Fenster verfügbar. EndPaint zeigt auch das Caret an, wenn es zuvor von BeginPaint ausgeblendet wurde. BeginPaint blendet den Caret aus, um zu verhindern, dass Zeichnungsvorgänge sie beschädigen.