Minimalgröße eines Fensters setzen

By dose | September 9, 2005
Under: technical stuff, Uncategorized

Wenn man einen resizable Dialog erstellt, dann ist man natürlich daran interessiert,
dass sich die Dialog-Controls entsprechend an die aktuelle Fenstergröße anpassen und der
neu entstehende Raum im Dialogfeld nicht ungenutzt bleibt.
Dummerweise ist dies garnicht so einfach, da es von der WIN32-API nativ keine Docking bzw. Anchoring-Unterstützung gibt. Man muss einfach die WM_SIZE Nachricht dispatchen und dort die controls (=child windows) entsprechend neu zeichnen. Dies ist insofern ärgerlich, als dass es eine ziemliche Herumfitzelei ist, und sobald man etwas am Form-design ändert, funktioniert der Code möglicherweise schon nicht mehr. Daher haben sich einige Programmierer daran gemacht, Klassen zur Lösung dieses Problems zu schreiben. Dummerweise sind die meisten erhältlichen Klassen aber für die MFCs. Wenn man diesen Ballast aber nicht mit seiner Applikation herumschleppen möchte, und sich ohnehin, wie ich etwa, nicht so recht mit der etwas chaotischen MFC anfreunden mag, sucht man relativ lange, bis man etwas Brauchbares findet. Ich bin beim Stöbern im Netz auf eine brauchbare Klasse gestoßen, die klein, aber trotzdem praktisch und einfach aufgebaut ist. Grundsätzlich werden darin zwar auch MFC Debug-Makros verwendet, aber die kann man ja ohne Bedenken löschen. Sonst funktioniert die Klasse eigentlich problemlos mit plain-WIN32. Hier ist sie:

http://www.codeguru.com/Cpp/W-D/dislog/resizabledialogs/article.php/c5001/

Ich habe sie übrigens selbst für mich auch noch etwas optimiert, damit das Flackern beim Resizen nicht ganz so stark ist. Der Trick besteht darin, statt SetWindowPos lieber die Funktion DeferWindowPos zu verwenden. Für nähere Erläuterungen zur Funktionsweise mitte dem Link zur MSDN folgen.

Wenn man nun die Controls entsprechend dockt, bleibt immer noch das Problem, dass man die Form kleiner machen kann, als sie in ihrem Initialzustand war, und das sieht dann doch ziemlich merkwürdig aus, wenn die Controls gegenseitig überlappen. Daher sollte man idealerweise die Fensterminimalgröße auf die Anfangsgröße limitieren. Damit man diese nicht hartcodieren muss, bedient man sich einfach einer static-Variable, die den Initialzustand des Fensters speichert, somit ist man auch hier flexibel. Hier mein Code hierfür:

Leave a Comment

Name:

E-Mail :

Subscribe :
Website :

Comments :