GUI resizeable gestalten

  • Bisher bin ich bei AutoIt gut mit einem statischen GUI ausgekommen. Jetzt möchte ich eine Anzeige erstellen, welche mit unterschiedlichen Fenstergrößen läuft. Vollbild auf einem kleinen Zusatzmonitor ist das Ziel. Nur sind eben die Auflösungen nicht immer gleich und dann kommt noch das Seitenverhältnis hinzu. Früher waren es 4:3 und heutzutage ist irgendetwas um die 16:9 der Standard. :rolleyes:

    Ich habe schon GUIs mit Variablen erstellt. Wer hat zum Beispiel Lust, bei 32 möglichen Joystick-Tasten für jede einzelne die Position eines Radio-Buttons festzulegen. Ich hatte sie nicht. ;)

    Da ich ein Display aus einer realen Lokomotive darstellen möchte, werde ich da auch mit Variablen arbeiten. Mit Koda habe ich den Anhang erstellt, aber als Script wird mir z.Bsp. die Gruppenbezeichnung nicht angezeigt. :/ Deshalb wieder per Hand und besser (siehe "HEAD" eigentlich HEADLIGHTS zweizeilig).

    LOD.png

    Die Koordinaten und die Größe der Gruppen und Labels möchte ich anhand der Aufteilung festlegen. Hier mal als Beispiel:

    für die ganz rechte obere Gruppe "Unit ID" etwa so:

    • left: 1/3 der Fensterbreite plus zwei Pixel Freiraum
    • top: 0
    • width: 1/3 der Fensterbreite minus vier Pixel Freiraum
    • height: 1/10 der Fensterhöhe

    für die Gruppe "Distance Counter" darunter so:

    • left: 1/3 der Fensterbreite plus zwei Pixel Freiraum
    • top: 0 plus 1/10 der Fensterhöhe
    • width: 1/3 der Fensterbreite minus vier Pixel Freiraum
    • height: 1/10 der Fensterhöhe

    usw.

    Ist dies denn für die Veränderung der Fenstergröße hilfreich, wenn die GUI mit Variablen erstellt wird? Oder muss ich ganz anders ansetzen?

    Bezüglich Seitenverhältnis muss wohl eine zweite GUI her, das Vorbild ist halt 4:3 und das passt einfach nicht auf 16:9.

  • Du könntest deine GUI mit den Standard Resizing-Funktionen anpassen (GUICtrlSetResizing) und dazu noch eine minimale Größe festlegen.

    Mit dem Resizing hast du den Vorteil, dass du nicht die Controls selber verschieben (oder in Variablen irgendwie komisch speichern musst) sondern du legst einen Resizing-Modus fest (DockLeft + DockRight, oder wie du es willst) und wenn du die Größe des Fensters veränderst vergrößern/verkleinern und verschieben sich die Controls automatisch mit.

  • Für die Standard Resizing-Funktionen ist es also unerheblich wie die Anordnung für die Fenstergröße beim Start erstellt wird.

    Dann kann ich ja mit der Erstellung der GUI anfangen und dann die Optionen der GUICtrlSetResizing hinzufügen und schauen wie es sich auswirkt. Das Beispielskript der Funktion gib einiges her, zeigt aber auch deren Schwächen auf (Überlagerung etc.). Ich bin gespannt auf mein Ergebnis ;)

  • Du musst einfach nur eine Vorlage erstellen.

    Erstell in Koda das Fenster mit einer bestimmten Auflösung (z.B. minimum) und dann stellst du das Resizing ein und probierst es aus indem du das Skript in Koda startest und die Fenstergröße variierst.

    Die neuen Positionen werden anhand der Startkoordiation und des Resizingmodus' bestimmt.

  • Mach ich, nur ohne Koda. ;) Da dessen Ergebnis irgendwie nicht funktioniert. Und bei einem erneuten Koda-Aufruf der kxf-Datei sind die Labels kleiner und verschoben. :(

  • Ja Koda ist schon ein wenig in die Jahre gekommen und wird glaube ich auch nicht mehr weitergearbeitet.

    Generell empfiehlt es sich in Koda die Eigenschaft "AutoSize" für Labels zu deaktivieren wenn man feste Größen haben möchte.

    Wenn du deiner GUI noch den Style $WS_SIZEBOX verpasst, dann kannst du das Fenster auch verziehen und die ganzen Controls werden dementsprechend angepasst.

    Allerdings nur die Position + Größe! Wenn du die Schriftgröße anpassen musst musst du berechnen wie viel größer dein Fenster geworden ist und es mit der Schriftgröße verrechnen.

    Da gibts sogar bereits einige Beispiele im Internet dafür, ich hab dein Skript mal angepasst um es zu resizen und hab mal ein einfaches Beispiel gebastelt wie man das FontResizing realisieren kann.

    Es wird die WM_SIZE-Nachricht abgefangen (die schickt Windows immer wenn die Fenstergröße angepasst wird) und dann wird anhand der Länge (für eine gute Skalierung muss man auch Höhe in Betracht nehmen) die Schriftgröße angepasst. Aktuelle Größe / Normale Größe * Normale Schriftgröße (Z. 180).

    Probiers mal aus in dem du das Fenster horizontal streckst, das Label oben links skaliert, von der Schriftart her, mit.

    Wenn du das für alle Controls machst und eine minimale Größe festlegst kannst du das Programm für alle Bildschirmauflösungen verwenden.


    Es empfiehlt sich noch die DPI-Einstellung des Rechners auszulesen, da fast alle Nutzer die 4K oder eine ähnliche Auflösung haben, mit einem DPI-Wert von >100% arbeiten.

  • Danke! Du hast ja den zweiten Schritt vor meinem ersten ausgeführt. :huh:

    Das sind eine Menge Infos, die ich mal verarbeiten muss. ;)

    Die Zahl 136 bei der Formel für die Schriftgröße ist ein Erfahrungswert von Dir? Bzw. sollte diese Zahl abhängig vom DPI-Wert sein?

    Und noch eine letzte Frage für heute: Kann man eine minimale Größe für das Fenster festlegen, oder nur für Controls?

  • Die Zahl 136 bei der Formel für die Schriftgröße ist ein Erfahrungswert von Dir? Bzw. sollte diese Zahl abhängig vom DPI-Wert sein?

    Und noch eine letzte Frage für heute: Kann man eine minimale Größe für das Fenster festlegen, oder nur für Controls?

    Die 136 ist die Standardgröße des Labels, wenn du das ganze so machen willst wie ich es vorgemacht habe solltest du statt hardgecodeten Zahlen Variablen verwenden, damit du sie nur an einer Stelle anpassen musst und sie im gesamten Script gültig sind.

    Das ist nur ein kleines Beispiel wie man das berechnen kann, du musst natürlich noch die Höhe berücksichtigen (oder du erlaubst nur, dass man das Fenster skaliert vergrößern kann und nicht nur horizontal/vertikal). Die Zahl sollte mit dem DPI-Wert umgerechnet werden, damit die Schrift auch auf Monitoren mit anderem DPI-Wert hübsch angezeigt werden.

    Musashi hat da ein wunderschönes Beispiel gepostet das du dir mal anschauen solltest! Kleines Desktop-Spiel (ChipHunter)

    Diese Zahl verrechnest du ähnlich wie mit der Fenstergröße und schwupps hast du ein Programm welches beim Resizen die Größe anpasst und auf jedem Rechner gleich aussieht!

    Für minimale Größen musst du eine andere Windows Nachricht registrieren, diese lautet WM_GETMINMAXINFO.

    Ich habe letztens erst ein kleines Beispiel gepostet wie man dort die minimale Größen registrieren kann (auch maximale Größen sind möglich!).

    Fenster Größe veränderbar - Minimum nicht unterschreiten

  • Ich mag die Resizefunktion von Autoit nicht wirklich... dort treten öfter glitches auf und es wird nicht genauso skaliert, wie ich es gerne haben möchte. Deshalb bau ich mir das Resizen immer selbst.

    Beispiel:

    Dabei nutze ich, wenns geht auch Arrays, da diese das Positionieren vereinfach. Außerdem sollte man gerade in der Resizefunktion viele Variablen nutzen.

    Die meisten "Festen" Abstände lege ich auch als globale Variablen oben an, sodass ich dort später einfach einen Pixelwert ändern kann um das Design anzupassen.

    Das bauen der Resize funktion kann aber bei komplexen Fenstern schnell unübersichtlich werden. Also immer viele und Aussagekräftige Variablen nutzen :)

    MfG Kanashius

  • alpines die 136 half mir weiter ;)

    Kanashius ob ich es schaffe Deinen Code zu verstehen, muss ich mal sehen :huh:

    Ich hatte heute erst wieder Zeit an der GUI zu arbeiten. Warum die weiße Schrift der Gruppen nicht funktionierte lag an den Themes von Windows. Die lassen kein Einfärben zu, siehe Hilfe zu GUICtrlSetColor. Deshalb habe ich jeder Gruppe

    AutoIt
    DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($Group1), "wstr", 0, "wstr", 0)

    hinzugefügt.

  • Die GUI steht, das war Einiges an Arbeit und die war recht lehrreich. ;)

    Das Ändern der Größe funktioniert soweit wunderbar. Wenn man es übertreibt, wird es unansehnlich. Die, vor dem Start, anpassbare Fenstergröße sollte da Abhilfe schaffen.

    Die Tipps zu DPI und Höhe von alpines sind noch nicht eingeflossen. Nur ein Skalieren zu erlauben, klingt verlockend. Mir würde es reichen. Nur wie lege ich das fest? Dazu konnte ich nichts finden.

    Edit: das könnte es sein, gefunden auf Autoscript.com