Fenstergröße begrenzen
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.
|