[wxWidgets] Fenstergröße eines Dialoges ändern
-
Hallo zusammen!
Ich habe ein kleines Programm mit wxWidgets geschrieben welches nur eine Reihe von statischen Textfeldern enthält. Diese Textfelder zeigen Zahlwerte an, mittels ->SetLabel kann der Benutzer durch Tastendruck diese Textfelder manipulieren, etwa eine der Zahlen um Eins erhöhen oder verringern.
Das Programmfenster wird "always on top" angezeigt, da es zusammen mit einer Flugsimulation verwendet werden soll.
Nun möchte ich gerne die Möglichkeit für den Benutzer schaffen, etwa durch einen Tastendruck, nur den oberen Teil der Textfelder anzeigen zu lassen, das Fenster also in der Höhe soweit zu verkleinern, dass nur noch z.B die obersten drei Textfelder angezeigt werden.
Mein erster Versuch das ganze statisch mit SetSize(a,b,c,d); umzusetzen schlägt leider Fehl. Verschiedene Rahmendesigns (WinXP, klassisch...) haben verschieden hohe SystemMenus, deshalb wird teilweise am unteren Rand zuviel "abgeschnitten".Hier mal ein paar Bildchen um das Problem zu verdeutlichen:
normale Fenstergröße
verkleinertes Fenster
"abgeschnittenes" Fenster bei anderem RahmendesignGibt es eine Möglichkeit soetwas vernünftig umzusetzen?
Eine andere Möglichkeit wäre vielleicht für das Dialogfenster immer das gleiche Design festzulegen, z.B Windows klassisch, auch wenn der Benutzer sonst z.B. das "Gummibärchendesign" WinXP bevorzugt...
Ich habe sonst leider keine Idee wie ich das umsetzen könnte, die Suche bei Google und co. hat mir leider auch nicht weitergeholfen.
LG Alberich
-
Ich verstehe dein Problem nicht. Willst du einfach die Fenster abschneiden? Willst du beim verkleinerten Fenster andere Dialogfelder anzeigen lassen? Warum funktioniert SetSize() nicht?
-
Ja, ich möchte vom Fenster den unteren Teil "abschneiden", an den Textfeldern selbst soll nichts geändert werden. SetSize als solches funktioniert da schon. Das Problem ist aber dass bei verschiedenen Rahmendesings die Höhe des Fensters verschieden ist, da mit dem WinXP-Design der obere Rand des Fensters (der Rand in welchem z.B. das X-Symbol zum Schliessen des Fensters liegt) eine andere Höhe hat als z.B. mit dem klassischen Windows-Design. Das hat erstmal nichts mit meinem Programm selbst zu tun sondern liegt an den Anzeige-Einstellungen im Betriebssystem des Benutzers.
Wenn ich das richtig sehe lege ich mit SetSize die Gesamthöhe des Fenster fest, also eigentlicher Programmteil plus Höhe des oberen Randes. Nun ist diese Höhe des oberen Randes aber von besagten Anzeige-Einstellungen des Benutzers abhängig, festgenagelte Werte für die Fensterhöhe passen dann nur für ein Design (siehe zweites Bild (klassisches Windows-Design) und drittes Bild (XP-Design) im ersten Post, beim XP-Design wird zuviel "abgeschnitten").
-
Ich glaube gerade eher weniger, dass zur Größe auch die Fenstergröße dazugehört (wäre aber denkbar). Kann es stattdessen sein, dass deine Controls im XP-Design eine andere Größe haben? Zudem wundere ich mich, dass deine beiden Screenshots ein unterschiedliches Format haben. Hast du die noch ausgeschnitten?
-
Ja, die Screenshots waren recht groß. Interessant ist ja sowieso nur der obere linke Teil.
Ich habe mittlerweile ein wenig experimentiert und glaube eine Lösung gefunden zu haben...//Im Event OnInit bestimme ich die tatsächliche Größe des Fensters mit wxSize framesizeSTART = this->GetSize(); sizeXSTART = framesizeSTART.x; sizeYSTART = framesizeSTART.y; //Im Event KeyDown für die Verkleinerung setze ich nun die Fenstergröße. this->SetSize(X,Y,sizeXSTART,sizeYSTART-104);
Es scheint zu funktionieren, auch mit einem anderen Design wird nichts mehr zuviel abgeschnitten. Der Fensterteil der abgeschnitten wird ändert mit anderen Designs nicht die Größe, deshalb klappt es hier mit einem festen Wert von 104 Pixeln.
Es ändert sich nur die Höhe des oberen Randes, mit GetSize() beim Erstellen des Fensters wird das nun aber berücksichtigt.
Die Auflösung war bei allen ScreenShots die gleiche, 1280x960.
-
Wäre es nicht besser eine richtige ingame gui zu verwenden wie CEGUI?
-
Könntest du statt 104 abzuziehen nicht einfach die Position des Buttons rechts unten im verkleinerten Modus plus seine Größe nehmen? Das wäre dann ja die neue Fenstergröße.
-
Scorcher24 schrieb:
Wäre es nicht besser eine richtige ingame gui zu verwenden wie CEGUI?
Das wäre bestimmt besser, wenn ich nicht so ein Wald-und-Wiesen-Programmierer wäre...
Ich habs ja gerade so geschafft mir die Anfänge mit C++ und wxWidgets draufzuschaffen.wxSkip schrieb:
Könntest du statt 104 abzuziehen nicht einfach die Position des Buttons rechts unten im verkleinerten Modus plus seine Größe nehmen? Das wäre dann ja die neue Fenstergröße.
Stimmt, ist zwar nur ein Panel, aber das ist ja wurscht. Ist wahrscheinlich auch die sichere Variante, so würde gewiss weder zuviel noch zuwenig abgeschnitten. Danke für den Tipp!
-
Wie hast du dann das Spiel programmiert?
Oder ist das nicht deines?
-
Um Gottes willen, Nein! Das Spiel ist nicht von mir!
Ich schreibe nur dieses kleine Tool. Von der Fangemeinschaft für die Fangemeinschaft, sozusagen...
Ich bin von Hause aus Physiker, kein Programmierer oder Informatiker!