GUI/Fenster bei Start des Scripts an gleicher Position wie beim letzten Mal öffnen

  • Gibt es eine einfache Möglichkeit, eine GUI beim nächsten Start des Scripts an der Position zu öffnen, wo sie der Benutzer beim letzten Mal hingeschoben hat? Auch hierzu fehlten mir die Suchbegriffe - nichts gefunden.

    :)

  • Gibt es eine einfache Möglichkeit, eine GUI beim nächsten Start des Scripts an der Position zu öffnen, wo sie der Benutzer beim letzten Mal hingeschoben hat?

    Du könntest z.B. mittels WinGetPos die aktuelle Position und Größe des laufenden (aktiven) GUI's ermitteln und beim Beenden des Skriptes in eine .ini-Datei schreiben. Startest Du das Programm erneut, dann lese die Werte aus der .ini wieder ein. Sollten sie sich von den Defaults unterscheiden, dann öffne das GUI mit diesen Werten.

    Du kannst auch mal einen Blick in den Thread WindowPlacement werfen.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Du könntest z.B. mittels WinGetPos die aktuelle Position und Größe des laufenden (aktiven) GUI's ermitteln und beim Beenden des Skriptes in eine .ini-Datei schreiben.

    WinGetPos allein reicht da aber nicht, denn damit bekommst du die Größe des Fensters mit Rahmen. Beim Erstellen einer GUI gibst du aber die Größe ohne Rahmen an, also die ClientSize! Die muss ergo auch ermittelt und gespeichert werden.

    GUICreate ( "title" [, width [, height [, left = -1 [, top = -1 [, style = -1 [, exStyle = -1 [, parent = 0]]]]]]] )

    Von WinGetPos brauchst left und top, von WinGetClientSize width und height.

    GUICreate ("title", $aWinPos[0], $aWinPos[1], $aClientSize[0], $aClientSize[1])

    Doch birgt dieses Vorgehen viele Tücken... denn es berücksichtigt nicht, ob ein Fenster minimiert oder maximiert ist - denn in beiden Fällen fehlt dir nachher die Größe, um ein WinSetState($hGUI, '', @SW_RESTORE) zu machen, weil du so ja nur die Größe für minimiert oder maximiert speicherst, was übgrigens zu einem weiteren Fehler führt.

    Wie Musashi bereits empfohlen hat, solltest du deshalb besser einen Blick in den Thread WindowPlacement werfen.

    Ich habe hier im Anhang auch eine WindowPlacement-Version... ähnlich wie die von Oscar , und ein Example dazu, mit ein paar zusätzlichen Spielereien... schau dir einfach mal beide an...

    WM_GETMINMAXINFOMinimale Größe der MainGUI wird begrenzt, kann also nicht kleiner wie angegeben werden.
    WM_SIZEControls werden beim Verändern der Fenstergröße angepasst.
    WM_NCLBUTTONDBLCLKEin Doppelklick auf die rechte untere Ecke, da wo die Punkte sind, setzt die Größe des Fensters wieder zurück, so wie sie beim ersten Start war.

    WindowPlacement_Example.au3 starten, Fenster verschieben und dann Script beenden. Script erneut starten, und siehe da, die Fenster erscheinen an der Position, an die du sie vor Beenden des Scripts verschoben hattest.

    Ist die linke obere Ecke des Fensters nicht sichtbar, wird es verschoben. Wenn $g_bPrimary = False, auf den Monitor, der den Koordinaten am nähesten ist, an der sich das Fenster gerade befindet. $g_bPrimary = True, wird es auf den primären Desktop verschoben. Zusätzlich kann noch ein Offset angegeben werden... das erledigt dann die Funktion _CheckWinPos.

    Hier ein Bsp.: _CheckWinPos($g_hMainGUI, $g_bPrimary, 50)

    Gut zu wissen: Wenn die in WINDOWPLACEMENT angegebenen Informationen zu einem Fenster führen würden, das vollständig außerhalb des Bildschirms liegt, passt das System die Koordinaten automatisch so an, dass das Fenster sichtbar ist, wobei Änderungen der Bildschirmauflösung und der Konfiguration mehrerer Monitore berücksichtigt werden.

  • Perfekt, funktioniert auf Anhieb einwandfrei mit WindowPlacement - insgesamt nur 9 Zeilen ins Programm eingefügt für 2 zu sichernde Fenster - vielen Dank und schönes Wochenende!

    :)