GUI resizen und Button neu erstellen

    • Offizieller Beitrag

    Ich habe ein Problem beim erstellen von Buttons auf einer GUI, die in der Größe veränderbar sein soll.
    Erstelle ich die Button gleich beim GUI erstellen und resize dann die GUI, funktioniert alles wie es sein soll. Problematisch wird es, wenn ich die Button lösche und danach neu erstellen will (ist im Programm erforderlich).
    Sie sollen nach dem neu erstellen, wieder die gleiche Position einnehmen, wie vorher. Also auch beim resizen der GUI wieder mit verschoben werden. Und genau das bekomme ich nicht hin, bzw. nur mit einem Workaround (ich verkleinere die GUI auf die "normale" Größe lösche die Buttons, erstelle sie neu und vergrößere die GUI dann wieder auf die alte Größe). Dieser Workaround hat aber den Nachteil, dass man das verkleinern/vergrößern der GUI natürlich sieht und das stört mich.
    Hier ist mal ein Testscript, mit dem ihr das Verhalten ausprobieren könnt.
    Wenn ihr das Testscript startet und die GUI vergrößert, werden die Button korrekt verschoben (wie es sein soll). Klickt ihr dann aber auf den linken Button "Button neu erstellen 1", werden die Button falsch gesetzt (logisch, weil die Koordinaten nicht mehr stimmen).
    Aber auch, wenn ich die Koordinaten abhängig von der Größe der GUI erstellen würde, würden sie beim anschließenden Resizing falsch verschoben werden.
    Mein Workaround (siehe oben) habe ich mit dem Button "Button neu erstellen 2" nachgebaut. So passt wieder alles, aber das flackern der GUI beim verkleinern/vergrößern stört halt.
    Gibt es da eine bessere Methode, wie man das hinbekommen kann?

  • Hallo Oscar,

    teste einmal diese Func:

    Das klappt annäherend, die Rechenformel für die rechten 3 Buttons muss noch optimiert werden.

    mfg autobert

    Einmal editiert, zuletzt von autoBert (15. August 2015 um 17:22)

  • Ich habe das bisher immer so gemacht, dass ich eine resize Funktion erstelle, wo die Größe und Position für die GUI-Größe passend selbst berechnet wird. Dadurch würden neue Buttons auch eingeordnet werden.
    Beispiel für eine größere Gui mit mehreren Modi,... (MusicIt)

    Spoiler anzeigen


    Ansonsten seh ich da nur die Möglichkeit, irgendwie herauszufinden, nach welchem Prinzip das Automatische Resizen funktioniert und dann mit der Fenster-größe die Position und größe auszurechnen.

    • Offizieller Beitrag

    autoBert: Nein, das klappt leider nicht! Die Funktion müsste außerdem so aussehen:

    Damit werden die Button zwar an der richtigen Stelle wieder erstellt, aber beim anschließenden resizen der GUI befinden sie sich an einer ganz anderen Stelle.
    Vielleicht ist das auch ein Bug?! :huh:


    Kanashius: Oha! Bei jedem resizen, positionierst Du alles neu? Das ist aber sehr aufwendig. Das muss doch auch einfacher gehen...

  • Naja, sagen wirs mal so. Ich hab die Funktion geschrieben und konnte dann mit der gui machen was ich wollte. (Die ist nur so groß, weil es so 30+ Controls sind und bei unterschiedlichen modi unterschiedlich platziert werden)
    Bei 10 Controls wärs auch nur 15 Zeilen lang oder so. Manchmal kann man sowas ja auch mit arrays und schleifen regeln, kennst du ja alles.
    Ich finde, das ist die beste Methode, wenn man die absolute Kontrolle über die Positionierung haben will. Wenn dann was nicht passt kann mans dort jederzeit ändern :).
    Außerdem muss man nicht jedesmal alle Positionen,... bei der guierstellung raussuchen. Ich ruf nach der erstellung einfach einmal die Sizefunktion auf und schon sitzt alles. Dadurch sind dann guictrlstyles,... schön davon getrennt.

  • Du musst die Buttons am rechten Rand andocken:

    die Formel für die rechten Buttons muss noch um einen Korrekturfaktor (-x) erweitert werden.

    Edit: Wenn die Position zur Horizontalen Mitte absolut sein soll ist eine ChildGui notwendig bei der dann die rechten Buttons an der linken Seite angedockt werden. Die ChildGui muss natürlich mit WinMove bei jeder Größenänderung an die ParentGui angepasst werden.

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (15. August 2015 um 19:16)

    • Offizieller Beitrag

    Auch beim andocken an den rechten Rand stimmen die Positionen nicht mehr, sobald man nach dem neu erstellen die GUI resized.
    Das passt zwar für den Moment des Erstellens, aber nicht mehr beim resizen. Das ist ja das Problem...

    Das Ganze komplett neu zu setzen (wie Kanashius) widerstrebt mir irgendwie. ^^

  • Auch beim andocken an den rechten Rand stimmen die Positionen nicht mehr, sobald man nach dem neu erstellen die GUI resized.
    Das passt zwar für den Moment des Erstellens, aber nicht mehr beim resizen. Das ist ja das Problem...

    Sie stimmen in Bezug auf den rechten Rand, wenn du sie (aus ästhetischen Gründen?) relativ zur horizontalen Mitte haben möchtest sehe ich neben der Methode von Kanshius nur die Möglichkeit einer Child-Gui welche mit WinMove bei jeder Größenänderung an die ParentGui angepasst wird. Ob dies weniger flackert als deine Func _CreateButton2() wage ich zu bezweifeln, im Gegenteil ich befürchte es wird dadurch schlimmer.

    mfg autoBert

    • Offizieller Beitrag

    Hmmm...ich muss mal schauen, ob ich nicht doch mit meinem Workaround (Button2) leben kann...

    Es ist schon etwas eigenartig, dass die Button da so (scheinbar) willkürlich verschoben werden.

    Oder...ich müsste genügend "Dummy"-Button erstellen und sie dann nur entsprechend ein-/ausblenden, dann brauche ich die Button nicht zu löschen/neu zu erstellen.
    Das wäre noch eine Möglichkeit! Muss ich mal testen...

  • Hier noch ein Workaround, welches nicht perfekt ist:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (16. August 2015 um 12:43)

    • Offizieller Beitrag

    UEZ: Dein Beispiel kann ich jetzt nicht testen, weil ich nicht weiß, was Du im Hauptscript noch geändert hast (Variable: $iSE)?

    Das mit den "Dummy"-Button ist auch keine Alternative, weil ja eigentlich mehr Button angezeigt werden sollen, wenn mehr Platz zur Verfügung steht.
    Oder man müsste zwei komplette GUIs erstellen und dann im DoubleBuffering-Verfahren arbeiten. Hmm...vielleicht doch etwas Overkill... :D

    • Offizieller Beitrag

    Das funktioniert fast gut!
    Beim maximieren des Fensters sind die Button jedoch verschwunden.

    Aber ich fürchte, die Probleme mit dem resizen werden noch schlimmer. Nachdem bei meinem Programm nun noch mehr Gui-Elemente dazugekommen sind, wird das Ganze chaotisch (egal mit welchen Werten/Kombinationen).
    Mit einer älteren Version von AutoIt hat das mal geklappt, aber jetzt geht das nicht mehr. GUICtrlSetResizing muss fehlerhaft sein oder ich bin zu blöd das System dahinter zu verstehen. :huh:

    Notgedrungen habe ich mich jetzt doch für die Kanashius-Methode entschieden und positioniere alle Gui-Elemente über WM_SIZE und GuiCtrlSetPos neu.
    Danke, an alle Beteiligten für eure Bemühungen/Lösungsvorschläge!

  • Meine Lösung: Ghost-Gui ( versteckt ) dort über deinen bisherigen Wert arbeiten dann die buttonwerte auslesen und daraufhin deinen Button erstellen.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Direkt beim maximieren noch nicht, aber wenn man dann auf "Button neu erstellen 1" klickt, sind die Button verschwunden (Win 7, 64 Bit).

    Stimmt, hängt daran, dass 400 - genommen wird.

    AutoIt
    $aidButton[1][$i] = GUICtrlCreateButton(Chr(65 + $i), 400 - $aPosW[2] + $aPosC[0] + 41 + $i * 50, 25, 45, 25)

    Beim Maximieren stimmt dann natürlich die 400 (Fensterbreite) nicht mehr. Dies müsste angepasst werden.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hallo Oscar,

    habe am Wochende zu Hause das von mir geänderte Script Filecommander gestestet. Die Änderungen die ich nach deinem letzten Post: FileCommander gemacht habe sind nicht mehr dokumentiert. Die Methode die du dort für die Drive-Buttons verwendest klappt jedoch unter Win 8.1 und AutoIt 3.3.14.1 immer noch. Die wichtigste Änderung danach war das einfügen von GUISetState(@SW_HIDE, $hGui) in Zeile 568, danach waren alle Resizing-Probleme verschwunden. Da ich vermute, dass dieses Hilfethema im Zusammenhang damit steht im Anhang die geänderte FileCommander.au3.

    • Offizieller Beitrag

    Ja, Du vermutest richtig, dass dieses Thema im Zusammenhang mit dem FileCommander steht.
    Wobei mir der Zusammenhang mit den Resizing-Problemen und dem GUISetState nicht wirklich einleuchtet.

    Allerdings ist die Methode, die ich dort verwende, die aus der Funktion "_CreateButton2" in Post#1. Also ein Workaround.
    Das wollte ich in der Neufassung ja besser machen. Weil sich das mit der Neufassung aber noch etwas hinziehen kann, werde ich erstmal die von Dir geänderte Version im FileCommander-Thread posten.
    Vielen Dank für die Mühe der Fehlersuche und die Änderungen.

    • Offizieller Beitrag

    Ich hatte vor Jahren mal begonnen, eine Resizing-Funktion zu schreiben, die mit diesen Problemen Schluss macht. Aber das klappte auch nicht 100%. Durch rechnerische Korrekturen verschoben sich die Positionen nach mehrfachem Resizing.
    Ich habe auf meiner Projektliste eine kpl. andere Positionierung für AutoIt zu entwickeln, relative Positionierung wie z. B. mit Tkinter. Mal sehen, wann ich das fertig kriege.