Fenstergröße begrenzen

Zurück Zum Inhaltsverzeichnis Weiter

In manchen Fällen kann es notwendig sein die Ausdehnung eines Fensters auf einen bestimmten Bereich zu begrenzen. Dabei können zwei Fälle unterschieden werden:

  • Das Fenster soll in seiner Größe überhaupt nicht veränderbar sein.
  • Das Fenster soll eine definierte minimale und/oder maximale Ausdehnung annehmen können.

Soll das Fenster überhaupt nicht in seiner Größe veränderbar sein, so kann dies am einfachsten durch einen entsprechenden Fensterstil erreicht werden. Frame-Windows besitzen in der Regel die Fensterstile WS_THICKBORDER, WS_MINIMIZEBOX und WS_MAXIMIZEBOX. Werden die beiden letzten Fensterstile weggelassen, so kann das Fenster durch den Anwender nicht mehr als Symbol bzw. als Vollbild dargestellt werden. Um nun das Fenster auch durch Ziehen am Fensterrahmen nicht mehr in seiner Größe verändern zu können, muss zusätzlich der Fensterstil WS_THICKBORDER durch den Stil WS_BORDER ersetzt werden. Den Fensterstil für Frame-Windows setzen Sie am Besten in der Methode PreCreateWindow(...) wie folgt um:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    .... // sonstige Aktionen

    // Vorgegebene Stile entfernen
    cs.style &= ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_THICKFRAME);
    // Neuen Rahmenstil hinzufuegen
    cs.style |= WS_BORDER
    // Hier koennen jetzt weiter Aktionen folgen
    ....
}

Sollen Fenster dagegen in der Größe veränderbar sein aber eine definierte minimale und/oder maximale Größe besitzen, so muss ein anderer Weg gegangen werden. Wie Sie bereits wissen, versendet WINDOWS eine WM_SIZE Nachricht wenn das Fenster in der Größe verändert wurde. Was noch fehlt ist eine Nachricht die während des Änderns der Fenstergröße versendet wird. Und diese Nachricht lautet WM_GETMINMAXINFO. Über diese Nachricht holt WINDOWS von der Anwendung Informationen über die zulässige Fenstergröße. Als Zusatzinformation enthält die Nachricht einen Zeiger auf eine MINMAXINFO Struktur die folgenden Aufbau besitzt:

typedef struct tagMINMAXINFO
{
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
} MINMAXINFO;

Alle Elemente der MINMAXINFO Struktur bestehen aus Strukturen von Typ POINT. Die Struktur POINT enthält nur die beiden Integer-Daten x,y für die Angabe von Koordinaten oder Ausdehnungen. Bei der Spezifikation von Ausdehnungen enthält das POINT-Element x die Breite und das POINT-Element y die Höhe.

Die erste POINT-Struktur ptReserved wird intern von WINDOWS verwendet. Die nachfolgende Struktur  ptMaxSize enthält die Ausdehnung die das Fenster annimmt wenn es zum Vollbild vergrößert wird. Auch die dritte POINT-Struktur ptMaxPosition bezieht sich nur auf die Vollbild-Darstellung des Fensters; sie gibt die Position der linken, oberen Ecke des Vollbild-Fensters an. ptMinTrackSize und ptMaxTrackSize spezifizieren die minimale bzw. maximale Fenstergröße die durch Ziehen am Rahmen des Fensters eingestellt werden kann. Aber Achtung!

Die Werte für die Fenstergröße im Element ptMaxSize müssen kleiner oder gleich den Werten im Element ptMaxTrackSize sein!

Damit können wir jetzt zur Verarbeitung der WM_GETMINMAXINFO Nachricht übergehen. Wie für (fast) alle WINDOWS-Nachrichten die in der MFC verarbeitet werden, stellt die MFC auch hierfür einen CWnd Nachrichtenbearbeiter OnGetMinMaxInfo(...) zur Verfügung. Die Methode OnGetMinMaxInfo(...) erhält als Parameter lpMMI einen Zeiger auf die oben erläuterte Struktur. Um einem Fenster nun eine minimale und/oder maximale Fenstergröße vorzugeben, müssen die Strukturelemente nur noch den Anforderungen entsprechend gesetzt werden. Eine vollständige OnGetMinMaxInfo(...) Methode könnte etwa wie folgt aussehen:

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
    // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen ....

   
    // Einstellungen fuer Groessenaenderung ueber
    // ziehen des Rahmens
    lpMMI->ptMinTrackSize.x = 300;
    lpMMI->ptMinTrackSize.y = 200;
    lpMMI->ptMaxTrackSize.x = 400;
    lpMMI->ptMaxTrackSize.y = 400;
    // Einstellungen fuer Vollbild
    // ptMaxSize muss kleiner/gleich ptMaxTrackSize sein!
    lpMMI->ptMaxSize.x = 300;
    lpMMI->ptMaxSize.y = 300;
    lpMMI->ptMaxPosition.x = 20;
    lpMMI->ptMaxPosition.y = 20;
}

Im Beispiel wird die minimale Fenstergröße, die durch Ziehen am Fensterrahmen eingestellt werden kann, auf 300x200 begrenzt und die maximale Fenstergröße auf 400x400. Klickt der Anwender auf das Maximierungssymbol in der Titelleiste, so wird das Fenster auf 300x300 'vergrößert' und die linke, obere Fensterecke erhält die Position 20/20.

Ein Beispiel hierzu finden Sie im Programmverzeichnis zum Kurs unter 03EPMMFC\WndSize.

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