Malen des Fensters

Sie haben Ihr Fenster erstellt. Nun möchten Sie etwas darin anzeigen. In der Windows-Terminologie wird dies als Malen des Fensters bezeichnet. Um Metaphern zu mischen, ist ein Fenster ein leerer Zeichenbereich, der darauf wartet, dass Sie es ausfüllen.

Manchmal initiiert Ihr Programm das Malen, um die Darstellung des Fensters zu aktualisieren. Zu anderen Zeiten benachrichtigt Sie das Betriebssystem, dass Sie einen Teil des Fensters neu streichen müssen. In diesem Fall sendet das Betriebssystem dem Fenster eine WM_PAINT Nachricht. Der Teil des Fensters, der gezeichnet werden muss, wird als Updatebereich bezeichnet.

Wenn ein Fenster zum ersten Mal angezeigt wird, muss der gesamte Clientbereich des Fensters gezeichnet werden. Daher erhalten Sie immer mindestens eine WM_PAINT Nachricht, wenn Sie ein Fenster anzeigen.

Abbildung des Updatebereichs eines Fensters

Sie sind nur für die Bemalung des Kundenbereichs verantwortlich. Der umgebende Rahmen, einschließlich der Titelleiste, wird automatisch vom Betriebssystem gezeichnet. Nachdem Sie das Malen des Clientbereichs abgeschlossen haben, löschen Sie den Updatebereich, der dem Betriebssystem mitteilt, dass es keine weitere WM_PAINT Nachricht senden muss, bis sich etwas ändert.

Angenommen, der Benutzer verschiebt ein anderes Fenster, sodass es einen Teil Ihres 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.

Abbildung, die zeigt, wie sich der Updatebereich ändert, wenn sich zwei Fenster überlappen

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

Abbildung, die zeigt, wie sich die Updateregion ändert, wenn die Größe eines Fensters geändert wird

In unserem ersten Beispielprogramm ist die Malroutine sehr einfach. Es füllt einfach den gesamten Clientbereich mit einer Einfarbigung 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 Neubemalungsanforderung aus. Der aktuelle Updatebereich wird im rcPaint-Member von PAINTSTRUCT angegeben. Dieser Updatebereich wird relativ zum Clientbereich definiert:

Abbildung des Ursprungs des Clientbereichs

In Ihrem Malcode haben Sie zwei grundlegende Optionen:

  • Zeichnen Sie 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 sie.
  • Optimieren Sie, indem Sie nur den Teil des Fensters innerhalb des Updatebereichs zeichnen.

Wenn Sie immer den gesamten Clientbereich zeichnen, ist der Code einfacher. Wenn Sie jedoch eine komplizierte Mallogik haben, kann es effizienter sein, die Bereiche außerhalb des Updatebereichs zu überspringen.

Die folgende Codezeile füllt den Updatebereich mit einer einzigen Farbe aus, wobei die systemdefinierte Fensterhintergrundfarbe (COLOR_WINDOW) verwendet wird. 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 ( rcPaint-Member von PAINTSTRUCT). Auf der ersten WM_PAINT Nachricht muss der gesamte Clientbereich gezeichnet werden, sodass rcPaint den gesamten Clientbereich enthält. Bei nachfolgenden WM_PAINT Nachrichten kann rcPaint ein kleineres Rechteck enthalten.

Die FillRect-Funktion ist Teil der Grafikgeräteschnittstelle (GDI), die Windows-Grafiken seit sehr langer Zeit unterstützt. In Windows 7 hat Microsoft eine neue Grafik-Engine namens Direct2D eingeführt, die hochleistungsfähige 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.)

Rufen Sie nach dem Malen die EndPaint-Funktion auf. Diese Funktion löscht den Updatebereich, der Windows signalisiert, dass das Fenster die Bemalung selbst abgeschlossen hat.

Nächste

Schließen des Fensters