Minimale Fenstergröße mit mehrzeiliger Menüleiste?
-
Hi Community,
habe ein ähnliches Problem wie im Thread von Zdravko: "Wie erstellt man ein Window mit genauen Breiten und Höhen?" http://www.c-plusplus.net/forum/viewtopic-var-t-is-180327.html.Bei mir allerdings im Zusammenhang mit dem maximal möglichen Platzbedarf für die Menüleiste selbst.
Oder genauer gesagt: Wie viele Pixel kann die Menüleiste in der Höhe für sich beanspruchen? Gemeint sind nur die obersten Einträge (die Menüleiste), d.h. alles was durch Benutzer-Aktion herunterklappt (die Popup-Menü) ist nicht Gegenstand meiner Problematik.In meiner Applikation verarbeite ich die Nachricht WM_GETMINMAXINFO, um so die minimale Fenstergröße begrenzen zu können.
Verkleinert man das Fenster, so versucht Windows eine Menüleiste (die nicht mehr in die Breite des Fensters untergebracht werden kann) auf mehrere Zeilen untereinander aufzuspalten.
Im schlimmsten Fall hat man für jeden Eintrag in der Menüleiste eine eigene Zeile... und dieser verlorene Platz geht auf Kosten der Client-Rect Fläche!
Dies hat zur Folge, daß die mir zur Verfügung stehende Fläche kleiner ist als von mir über WM_GETMINMAXINFO gefordert!
Selbst die Funktion AdjustWindowRect() kann mir da nicht weiterhelfen. In der MSDN-Doku ist zu lesen: "The AdjustWindowRect() function does not add extra space when a menu bar wraps to two or more rows."
Wie kann ich bei WM_GETMINMAXINFO die gewünschte minimale Fenstergröße (also das was nur für mich alleine zur verfügung steht ohne Scrollbalken, Menüleiste usw.) berechnen?
Zum Zeitpunkt von WM_GETMINMAXINFO ist das Fenster möglicherweise noch gar nicht verkleinert, so daß die Menüleiste noch komplett in einer Zeile passt...
Gruß und Danke schon mal im voraus
MartinP.S.: 'ne Bruthitze hier, geh mal Eis holen...
-
Mach das doch (hoffe ich hab Dich richtig verstanden
) via WM_SIZE. Die Größe (des Menüs) kannst Du dann (wenn ich mich grad mal nicht irre :p ) über die Differenz von GetWindowRect und GetClientRect plus GetSystemMetrics (die zutreffenden Flags (können ja mehrere sein, abhängig von Deinem Fenster-Style) musst Du Dir aus der MSDN-Funktionsbeschreibung suchen: http://msdn2.microsoft.com/en-us/library/ms724385.aspx) errechnen.
-
Hallo CodeFinder, Danke für den Tipp.
WM_GETMINMAXINFO wird zu Beginn der Größenänderung gesendet.
WM_SIZE wird nach erfolgter Größenänderung gesendet.D.h. ich müßte also hinterher das Fenster wieder vergrößern, was in meinen Augen ein wenig unprofessionell wirkt.
Aber durch Deinen Tipp komme ich auf die vielleicht passendere Nachricht: WM_SIZING, diese wird wohl bei jeder Größenänderung "online" permanent gesendet.

Ich werde mal diese Technik ausprobieren. Ich hoffe nur, daß die ständigen Größenkorrekturen kein unangenehmes Flackern hervorrufen...
Martin