Größenänderung des Fensters

Zurück Zum Inhaltsverzeichnis Weiter

Wie Sie im letzten Schritt erfahren haben sendet WINDOWS immer dann eine WM_PAINT Nachricht an ein Fenster wenn dessen Fensterinhalt (oder ein Teil davon) neu dargestellt werden muss. Dies war unter anderem auch dann der Fall wenn das Fenster vergrößert wurde. Doch häufig benötigen Anwendungen auch dann eine Nachricht über das Verändern der Fenstergröße wenn das Fenster verkleinert wird, so z.B. wenn Größe oder Position von Fensterelementen (Grafiken, Buttons usw.) unmittelbar von der Fenstergröße abhängen.

Wenn ein Fenster in seiner Größe verändert wird versendet WINDOWS eine WM_SIZE Nachricht. Die Zusatzinformationen zur Nachricht haben folgende Bedeutung:

WM_SIZE Nachricht

WPARAM wParam Auslöser der Nachricht
LPARAM lParam neue Größe der Client-Area

Die Zusatz-Information wParam enthält die Ursache für das Auslösen der Nachricht und kann eine der folgenden Konstanten sein:

ID

Bedeutung

SIZE_MAXHIDE Diese Nachricht wird an alle übergeordneten Fenster gesendet wenn ein anderes Fenster als Vollbild dargestellt wird.
SIZE_MAXIMIZED Das Fenster wurde zum Vollbild vergrößert.
SIZE_MAXSHOW Diese Nachricht wird an alle übergeordneten Fenster gesendet wenn eines der anderen Fenster vom Vollbild auf seine ursprüngliche Größe verkleinert wird.
SIZE_MINIMIZED Das Fenster wurde zum Symbol verkleinert.
SIZE_RESTORED Das Fenster wurde in der Größe verändert aber nicht zum Symbol verkleinert oder zum Vollbild vergrößert.

Beachten Sie bitte, dass die beiden Nachrichtentypen SIZE_MAXHIDE und SIZE_MAXSHOW von anderen Fenstern ausgelöst werden.

Die 32-Bit breite Zusatz-Information lParam enthält in komprimierter Form die neue Größe der Client-Area des Fensters. Das Low-Word (untere 16 Bits) enthält die Breite und das High-Word (obere 16 Bits) die Höhe.

Obwohl die Fensterbreite und -höhe intern als 32-Bit Werte vorliegen, enthält lParam nur jeweils die unteren 16 Bits. Zur Dekodierung des High- und Low-Words stehen die Makros HIWORD(x) und LOWORD(x) zur Verfügung.

Beachten Sie außerdem, dass beim Verkleinern des Fensters nicht automatisch eine WM_PAINT Nachricht generiert wird, wohl aber beim Vergrößern. Wollen Sie den Inhalt eines Fensters auch beim Verkleinern neu zeichnen lassen, so müssen Sie dies explizit durch den Aufruf der Funktion InvalidateRect(...) im Nachrichtenbearbeiter der WM_SIZE Nachricht tun.

Sie können das komplette Neuzeichnen des Fensters auch über den Stil der Fensterklasse veranlassen. Setzen Sie dazu den Fensterklassenstil CS_HREDRAW und/oder CS_VREDRAW. Beachten Sie dabei aber, dass immer der komplette Fensterinhalt beim Verändern der Fenstergröße als ungültig gekennzeichnet wird.
Fügen Sie nun in die Fensterprozedur die Bearbeitung der WM_SIZE Nachricht ein. Beim Eintreffen einer WM_SIZE Nachricht soll wieder mittels der Funktion MessageBeep(...) ein Ton ausgegeben werden, dies aber nur wenn das Fenster nicht zum Symbol verkleinert wird. Verwenden Sie aber einen anderen Klang wie bei der Bearbeitung der WM_PAINT Nachricht damit Sie zwischen den beiden Nachrichten unterscheiden können.

Lösung zur WM_SIZE Nachricht

// Die Fensterprozedur!
// --------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
                         WPARAM wParam, LPARAM lParam)
{
    // Nachrichten auswerten.
    switch (uMsg)
    {
    case WM_DESTROY:
        ....
    case WM_CLOSE:
        ....
    case WM_PAINT:
        ....

    case WM_SIZE:
        // Falls Fenster nicht zum Icon verkleinert
        if (wParam != SIZE_MINIMIZED)
        {
            // Fenster neu zeichnen lassen!
            InvalidateRect(hWnd,NULL,FALSE); // WM_SIZE signalisieren
            MessageBeep(MB_ICONEXCLAMATION);
        }
        return 0L;
    }
    // Nicht bearbeitete Nachrichten an WINDOWS uebergeben
    return DefWindowProc(hWnd, uMsg, wParam, lParam);

}

Ende der Lösung

Wenn Sie alles richtig eingegeben haben, sollten Sie bei jeder Größenänderungen (außer beim Verkleinern des Fensters zum Symbol) zwei unterschiedliche Klänge hören.

Damit sind wir am Ende dieses kleinen Ausflugs in die WINDOWS Programmierung unter C angekommen. Jetzt geht's dann weiter mit WINDOWS Programmen mit der MFC.

Zurück Zum Inhaltsverzeichnis Weiter


Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470