Malen des Fensters
Sie haben Ihr Fenster erstellt. Nun möchten Sie etwas darin anzeigen. In Windows Terminologie wird dies als Malen des Fensters bezeichnet. Um Dies zu kombinieren, ist ein Fenster ein leerer Zeichenbereich, der darauf wartet, dass Sie ihn ausfüllen.
Manchmal initiiert Ihr Programm das Malen, um die Darstellung des Fensters zu aktualisieren. Zu anderen Zeiten werden Sie vom Betriebssystem benachrichtigt, dass Sie einen Teil des Fensters neu anpainten müssen. In diesem Fall sendet das Betriebssystem dem Fenster eine WM _ PAINT-Meldung. Der Teil des Fensters, der gestrichet werden muss, wird als Updatebereich bezeichnet.
Wenn ein Fenster zum ersten Mal angezeigt wird, muss der gesamte Clientbereich des Fensters gestrichen werden. Daher erhalten Sie immer mindestens eine WM _ PAINT-Nachricht, wenn Sie ein Fenster anzeigen.

Sie sind nur für das Malen des Clientbereichs verantwortlich. Der umgebende Rahmen, einschließlich der Titelleiste, wird automatisch vom Betriebssystem gestrichen. Nachdem Sie das Zeichnen des Clientbereichs abgeschlossen haben, löschen Sie den Updatebereich, der das Betriebssystem darüber informiert, dass es erst dann eine weitere WM _ PAINT-Nachricht senden muss, wenn sich etwas ändert.
Angenommen, der Benutzer verschiebt ein weiteres Fenster, sodass es einen Teil des Fensters verdeckt. Wenn der verdeckte Teil wieder sichtbar wird, wird dieser Teil dem Updatebereich hinzugefügt, und Ihr Fenster empfängt eine weitere WM _ PAINT-Meldung.

Der Updatebereich ändert sich auch, wenn der Benutzer das Fenster streckt. Im folgenden Diagramm streckt der Benutzer das Fenster nach rechts. Der neu verfügbar gemachte Bereich auf der rechten Seite des Fensters wird dem Updatebereich hinzugefügt:

In unserem ersten Beispielprogramm ist die Malroutine sehr einfach. Es füllt einfach den gesamten Clientbereich mit einer Volltonfarbe aus. Dennoch reicht dieses Beispiel aus, um einige der wichtigen Konzepte zu veranschaulichen.
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
Starten Sie den Malvorgang, indem Sie die BeginPaint-Funktion aufrufen. Diese Funktion füllt die PAINTSTRUCT-Struktur mit Informationen zur Neu zeichnen-Anforderung auf. Der aktuelle Updatebereich wird im rcPaint-Member von PAINTSTRUCT angegeben. Dieser Updatebereich wird relativ zum Clientbereich definiert:

In Ihrem Malcode haben Sie zwei grundlegende Optionen:
- Paint den gesamten Clientbereich, unabhängig von der Größe des Updatebereichs. Alles, was außerhalb des Updatebereichs liegt, wird abgeschnitten. Das heißt, das Betriebssystem ignoriert dies.
- Optimieren Sie dies, indem Sie nur den Teil des Fensters innerhalb des Updatebereichs malen.
Wenn Sie immer den gesamten Clientbereich zeichnen, ist der Code einfacher. Wenn Sie eine komplizierte Mallogik haben, kann es jedoch effizienter sein, die Bereiche außerhalb des Updatebereichs zu überspringen.
Die folgende Codezeile füllt den Aktualisierungsbereich mit einer einzelnen Farbe und verwendet dabei die systemdefinierte Hintergrundfarbe des Fensters (COLOR _ WINDOW). Die tatsächliche Farbe, die von COLOR _ WINDOW angegeben wird, hängt vom aktuellen Farbschema des Benutzers ab.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
Die Details von FillRect sind für dieses Beispiel nicht wichtig, aber der zweite Parameter gibt die Koordinaten des zu füllenden Rechtecks an. In diesem Fall übergeben wir den gesamten Updatebereich (das rcPaint-Member von PAINTSTRUCT). In der ersten WM _ PAINT-Nachricht muss der gesamte Clientbereich gestrichen werden, sodass rcPaint den gesamten Clientbereich enthält. Bei nachfolgenden WM _ PAINT-Meldungen kann rcPaint ein kleineres Rechteck enthalten.
Die FillRect-Funktion ist Teil des Graphics Device Interface (GDI), das sehr lange Windows unterstützt. In Windows 7 hat Microsoft eine neue Grafik-Engine namens Direct2D eingeführt, die leistungsstarke Grafikvorgänge wie hardwarebeschleunigung unterstützt. Direct2D ist auch für Windows Vista über das Plattformupdate für Windows Vista und für Windows Server 2008 über das Plattformupdate für Windows Server 2008 verfügbar. (GDI wird weiterhin vollständig unterstützt.)
Nachdem Sie mit dem Malen fertig sind, rufen Sie die EndPaint-Funktion auf. Diese Funktion clears the update region, which signals to Windows that the window has completed painting itself.