Dialog-Elemente an Bildschirmzoom anpassen

  • Hallo!

    Ich versuche gerade, meinen Dialog an den Bildschirmzoom anzupassen. Bei der Dialoggröße geht das einfach mit Global $hMainGui = GUICreate('Konzernregelwerke', @DesktopWidth - 220, @DesktopHeight - 80, -1, -1). Bei 1920x1080 Normalzoom (Zomm 100%) ist der Dialog 1700 breit (@DesktopWidth - 220) und 1000 hoch (@DesktopHeight - 80).

    Nur bei den beiden Elementen (Treeview und WebBrowser-Control) bekomme ich das nicht hin. Bei 1920x1080 Normalzoom (Zomm 100%) haben die Elemente folgende Abmessungen.

    Code
    Global Const $GUIActiveX = GUICtrlCreateObj ($oIE, 372, 150, 1330, 850) ; WebBrowser-Control
    Global $idTreeview = GUICtrlCreateTreeView(6, 150, 361, 850, $GUI_SS_DEFAULT_TREEVIEW, $WS_EX_CLIENTEDGE) ; Treeview

    Also WebBrowser 1330 breit und 850 hoch. Treeview 361 breit und 850 hoch. Wie kann ich das automatisch anpassen? Wonach muss ich im Internet suchen? Da kann ich ja nicht einfach mit "GUI-Abmessung/Bildschirmauflösung - Control-Abmessung" arbeiten?! Internetrecherche hat nicht geholfen. Danke!

    Gruß, René

  • hmm gerade mal rumprobiert, starte das Skript dann beende es ändere die Auflösung und sehe was passiert.
    Ich habe eigentlich immer Statische Fenster, deswegen weiß ich nicht wie man wärend das Programm läuft die Größen ändert.

    in diesem Beispiel werden die Größen von Control und Treeview proportional zur GUI-Größe festgelegt. Die Berechnungen basieren auf dem verhältnis von 70% für das Control und 20% für den Treeview, sowohl in der Breite als auch in der Höhe.


    2 Mal editiert, zuletzt von MojoeB (6. September 2023 um 21:39)

  • Danke! Eine kleine Anpassung musste ich vornehmen.

    Leider passt es nicht ganz. Der Abstand des WebBrowsers zum Treeview passt dann nicht.

    Bei normaler Größe sieht es aus wie bild1.

    Bei Reduzierung sieht es aus wie bild2. Man sieht, dass der Abstand nicht passt. Ändere ich den Abstand z.B. auf 280, sieht es aus wie bild3. Irgendwie denke ich falsch. Gibt es eine Lösung?

  • ich habe grad nochmal rumgetestet mit einer anderen gui und mehr Steuer Elementen und ich muss dir sagen X( das zerbricht mir echt den Kopf ^^

    als Beispiel war das irgendwie einfacher ^^.

    was du natürlich auch tun könntest deine gui in eine Methode (func) schreiben.

    Und bei Start je nach Auflösung die grad gesetzt ist das mit verschieden if-abzweigungen in der Methode starten lassen um auf die richtigen Koordinaten-Werte zu kommen, die du dann natürlich zuvor in der Methode gesetzt hast.

    Das ist mehr schreib Arbeit ist dann aber auch zuverlässig, da du die werte ja selbst gesetzt hast.

  • das zerbricht mir echt den Kopf

    Das glaube ich sofort. ;)

    Das eigentliche Problem ist, dass das Dokument nicht am linken Rand erscheint, sondern irgendwo in der Mitte. Das bekomme ich auch nicht hin, wenn ich mit den passenden Maßen starte.

  • Deine Problemstellung hat mich zu dieser Lösung inspiriert :)

    Es geht in Richtung UDF, es fehlen aber noch setter/getter Methoden und die documentation,... . Ich werds vermutlich demnächst dazu machen und das dann auch hier im Forum posten; mir fehlt grad die Zeit.

    Mit der Methode kann ein GridLayout erstellt werden, bei dem dann andere Controls, GridLayouts oder auch einfach Funktionen (mit den passenden Parametern) hinzugefügt werden.

    Dabei wird die Position im Grid mit dem Index für die Reihe/Spalte angegeben und dann wird noch die Höhe der Reihe/Breite der Spalte als Prozent wert von 0 bis 1 angegeben. Es zählt immer der letzte Aufruf, wenn mehrere Einträge in einer Reihe eine Höhe angeben; Default behält die vorherige angabe bei.

    Wenn gar kein Wert angegeben wird, werden von allen angegebenen Reihen/Spalten die Prozent-Werte abgezogen und der übrige Platz wird gleichmäßig auf die übrigen Reihen/Spalten verteilt.

    Das ganze wird dann zu diesem Design:

    Dabei werden die TreeViews als Control in das GridLayout eingefügt, die Buttons in ein weiteres GridLayout, welches dann in das Main GridLayout integriert wird.

    Die Labels werden mithilfe einer Funktion an die richtige Position gebracht. Es kann also auch für "CustomControls",... verwendet werden, man muss sich dann halt selber um das resizing an die gewollte position/größe selbst kümmern.

    Wenn sich die Größe des Fensters ändert wird mit WM_SIZE die position/größe für das MainLayout angepasst.

    Viel Spaß damit :)

  • Hab es probiert. Solange ich meinen Treeview-Code und IE-Code nicht einfüge, funktioniert es fasst (bis auf Abstand zwischen Treeview und IE-Objekt), inklusive Ribbon. Aber mit meinem Code funktioniert es nicht.