Mehrere Fenster verwalten (Fokus, Aktivierung, Hide, Show)

  • Da hab ich schon ein neues Problem, was mich jetzt schon ein paar Stunden beschäftigt. Vorweg, dieses Thema gibt es hier schon oft, auch die Hilfe hat Beispiele. Aber irgendwie ist nie genau das dabei, was ich gerne hätte. Also hab ich versucht, mir aus verschiedenen Thread's etwas zusammen zu suchen.
    Die Aufgabe ist, von einem Hauptfenster mit Klick auf irgendwas ein zweites Fenster zu öffnen. Dieses soll dann das aktive Fenster sein und das Hauptfenster DISABLEn. Schließt man das zweite Fenster, egal mit was und aber auch mit X in der Windows-Leiste, soll es 'verschwinden' und das Hauptfenster wieder zum aktiven machen. Eigentlich nichts weltbewegendes, aber naja...
    Mein Script macht das alles, aber nur teils zufriedenstellend. Ich hab es ein wenig kommentiert und bei ';Windows-X von Win_2' ist es so, wie es sein soll. Nur das WinActivate aktiviert zwar das Hauptfenster wieder, aber sichbar verzögert. Als ob das Fenster komplett neu aufgebaut wird. Das stört mich, hab aber bisher keine brauchbare Lösung gefunden. In ';Ende-Button von Win_2' sieht man ein paar Befehle, die ich probiert habe.
    Vielleicht kann jemand von euch mal einen Blick drauf werfen und mir sagen, was da falsch ist?!

    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit][autoit][/autoit][autoit]

    $formWin_1 = GUICreate("Form1")
    $btn_insert_1 = GUICtrlCreateButton("Insert", 10, 60, 60, 24)
    $btn_end_1 = GUICtrlCreateButton("End", 10, 90, 60, 24)
    ;GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    $formWin_2 = GUICreate("Form2", 300, 200)
    $btn_end_2 = GUICtrlCreateButton("End", 10, 60, 60, 24)
    ;GUISetState(@SW_HIDE)

    [/autoit][autoit][/autoit][autoit]

    ;Bei beiden der selbe Effekt
    ;GUISwitch($formWin_1)
    GUISetState(@SW_SHOW, $formWin_1)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $msg = GUIGetMsg(1)

    [/autoit][autoit][/autoit][autoit]

    Select
    ;Insert-Button von Win_1
    Case $msg[0] = $btn_insert_1
    GUISetState(@SW_SHOW,$formWin_2)
    GUISetState(@SW_DISABLE,$formWin_1)

    [/autoit][autoit][/autoit][autoit]

    ;Ende-Button von Win_1
    Case $msg[0] = $btn_end_1
    Exit

    [/autoit][autoit][/autoit][autoit]

    ;Windows-X von Win_1
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $formWin_1
    Exit

    [/autoit][autoit][/autoit][autoit]

    ;Windows-X von Win_2
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $formWin_2
    GUISetState(@SW_HIDE,$formWin_2)
    GUISetState(@SW_ENABLE,$formWin_1)
    WinActivate($formWin_1)

    [/autoit][autoit][/autoit][autoit]

    ;Ende-Button von Win_2
    Case $msg[0] = $btn_end_2
    GUISetState(@SW_HIDE,$formWin_2)
    GUISetState(@SW_ENABLE,$formWin_1)
    ;WinActivate($formWin_1) ; Das selbe wie ohne WinActivate
    WinSetState($formWin_1, "", @SW_ENABLE)
    ;WinClose($formWin_1, "") ; schließt beide Fenster
    ;WinSetOnTop($formWin_1, "", 1) ; Legt es dann immer nach vorne

    [/autoit][autoit][/autoit][autoit]

    ;Mit geht garnichts! War im Bsp-Code dabei.
    ;ExitLoop
    EndSelect
    WEnd

    [/autoit]


    Mir grault es schon, wenn ich mal noch ein weiteres Fenster einbinden möchte. ;)

  • Mir grault es schon, wenn ich mal noch ein weiteres Fenster einbinden möchte. ;)

    warum?

    Wie ich sehe verwendest du schon den Advanced-Mode von GuiGetMsg. Wenn du jetzt noch $msg[1] ausweretest und anstelle von select switch nimmst kannst du das ganze übersichtlich halten. Hier ein allgemeines Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include<WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $idGui1, $idGui2=-99, $idMsgBox, $idZurueck, $idbtnExit2
    _CreateGui2() ;entweder hier oder erst wenn benötigt ($idbtmToGui2 Klick)

    [/autoit] [autoit][/autoit] [autoit]

    $idGui1 = GUICreate('GUI 1', 400, 280, 140, 150, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    ;erzeugt eine GUI die zurückgebebene ID wird in der Variablen $idGui1 gespeichert
    ;die GUI hat BOXen für Mininmieren, Maximieren und ist in der Größe frei änderbar
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnToGui2 = GUICtrlCreateButton('&Aufruf GUI 2', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnICQ = GUICtrlCreateButton('&ICQ', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "ICQ" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnExit1 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $idGui1)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg(1) ;extended Modus wichtig!!
    Switch $nMsg[1] ;für welches Fenster ist die Message
    Case $idGui1 ;ab hier ist Gui 1 dran
    Switch $nMsg[0] ;welche Message wurde ausgelöst
    Case $idbtnToGui2
    ; GUISetState(@SW_DISABLE, $idGui1) ;Gui 1 für disablen
    ;If $idGui2 = -99 Then _CreateGui2() ;nur wenn nicht am Anfang bereits erzeugt nötig, dann auf Vorbelegung der Variable in Global achten)
    GUISetState(@SW_SHOW, $idGui2) ;Gui 2 anzeigen
    GUISetState(@SW_DISABLE,$idGui1)
    Case $idbtnICQ
    MsgBox(0,"","Jetzt würde ICQ gestartet")
    ;Run("C:\Program Files\ICQ7.0\ICQ.exe")
    Case $idbtnExit1, $GUI_EVENT_CLOSE
    _end()
    EndSwitch
    Case $idGui2 ;ab hier ist Gui 2 dran
    Switch $nMsg[0] ;welche Message wurde ausgelöst
    Case $idMsgBox
    MsgBox(0, 'Test', 'Test', 0, $idGui2)
    Case $idZurueck, $GUI_EVENT_CLOSE
    GUISetState(@SW_ENABLE, $idGui1) ;Gui 1 für ensablen
    GUISetState(@SW_HIDE, $idGui2) ;Gui 2 verstecken
    Case $idbtnExit2
    _end()
    EndSwitch
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreateGui2()
    $idGui2 = GUICreate('GUI 2', 500, 300, 200, 50, -1, -1, $idGui1) ;wichtig ist der letzte Parameter
    ;erzeugt eine GUI als Child von Gui1, die zurückgebebene ID wird in der Variablen $idGui2 gespeichert

    [/autoit] [autoit][/autoit] [autoit]

    $idMsgBox = GUICtrlCreateButton('&MsgBox', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "MsgBox" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idZurueck = GUICtrlCreateButton('&Zurück zu GUI 1', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "zurück" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnExit2 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "beenden" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
    EndFunc ;==>_CreateGui2

    [/autoit] [autoit][/autoit] [autoit]

    Func _end()
    GUIDelete($idGui2)
    GUIDelete($idGui1)
    Exit
    EndFunc ;==>_end

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    mfg autoBert

  • Du kannst dir ja mal den OnEvent - Modus anschauen, ist meiner Meinung nach übersichtlicher, gerade bei mehreren GUIs wobei das Geschmackssache ist denke ich.

    [autoit]

    Opt("GuiOnEventMode", 1)
    GUISetOnEvent
    GUICtrlSetOnEvent

    [/autoit]


    Vielleicht gefällt der dir ja besser ;)

  • OT: Also zitieren ist ja hier ziemlich bescheiden gelößt. Muß ich mich jetzt erst Stunden damit beschäftigen, oder kann ich mit AutoIt weitermachen? :whistling:

    @Milla: Ich hab wirklich vieles probiert. Mit beiden Modi. Ich hab's einfach nicht besser hinbekommen.

    autoBert: Warum? Weil ich mich erst seit 3 Tagen mit AutoIt beschäftige. ;)
    Aber dein Script macht genau das, wie ich es gerne hätte. Ich schau mir das jetzt genauer an und versuche zu verstehen wie was funktionert. Aber das hilft mir auf jedenfall schonmal weiter. Hätte ich das hier im Forum gefunden, wäre meine Zeitersparnis enorm gewesen. :)

    Danke euch beiden!

  • Also wenn du schon beides versucht hast würde ich dir trotzdem empfehlen, dass du dir den OnEvent mode näher anschaust weil dann garantiert ist, dass deine GUI immer ansprechbar ist und es programmiertechnisch einfach schöner ist

    Hier mal dein Bsp mit OnEvent:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include<WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GuiOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $idGui1, $idGui2 = -99, $idMsgBox, $idZurueck, $idbtnExit2
    _CreateGui2() ;entweder hier oder erst wenn benötigt ($idbtmToGui2 Klick)

    [/autoit] [autoit][/autoit] [autoit]

    $idGui1 = GUICreate('GUI 1', 400, 280, 140, 150, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    ;erzeugt eine GUI die zurückgebebene ID wird in der Variablen $idGui1 gespeichert
    ;die GUI hat BOXen für Mininmieren, Maximieren und ist in der Größe frei änderbar
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnToGui2 = GUICtrlCreateButton('&Aufruf GUI 2', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    GUICtrlSetOnEvent(-1, "_idbtnToGui2")
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnICQ = GUICtrlCreateButton('&ICQ', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    GUICtrlSetOnEvent(-1, "_idbtnICQ")
    ;verankert den Button "ICQ" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnExit1 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    GUICtrlSetOnEvent(-1, "_idbtnExit1")
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $idGui1)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreateGui2()
    $idGui2 = GUICreate('GUI 2', 500, 300, 200, 50, -1, -1, $idGui1) ;wichtig ist der letzte Parameter
    GUISetOnEvent(-1, "_CloseidGui2")
    ;erzeugt eine GUI als Child von Gui1, die zurückgebebene ID wird in der Variablen $idGui2 gespeichert

    [/autoit] [autoit][/autoit] [autoit]

    $idMsgBox = GUICtrlCreateButton('&MsgBox', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    GUICtrlSetOnEvent(-1, "_idMsgBox")
    ;verankert den Button "MsgBox" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idZurueck = GUICtrlCreateButton('&Zurück zu GUI 1', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    GUICtrlSetOnEvent(-1, "_idZurueck")
    ;verankert den Button "zurück" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

    [/autoit] [autoit][/autoit] [autoit]

    $idbtnExit2 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    GUICtrlSetOnEvent(-1, "_idbtnExit2")
    ;verankert den Button "beenden" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
    EndFunc ;==>_CreateGui2

    [/autoit] [autoit][/autoit] [autoit]

    Func _end()
    GUIDelete($idGui2)
    GUIDelete($idGui1)
    Exit
    EndFunc ;==>_end

    [/autoit] [autoit][/autoit] [autoit]

    #Region idGui1 Events
    Func _idbtnToGui2()
    GUISetState(@SW_SHOW, $idGui2) ;Gui 2 anzeigen
    GUISetState(@SW_DISABLE, $idGui1)
    EndFunc ;==>_idbtnToGui2

    [/autoit] [autoit][/autoit] [autoit]

    Func _idbtnICQ()
    MsgBox(0, "", "Jetzt würde ICQ gestartet")
    ;Run("C:\Program Files\ICQ7.0\ICQ.exe")
    EndFunc ;==>_idbtnICQ

    [/autoit] [autoit][/autoit] [autoit]

    Func _idbtnExit1()
    _end()
    EndFunc ;==>_idbtnExit1
    #EndRegion idGui1 Events

    [/autoit] [autoit][/autoit] [autoit]

    #Region idGui2 Events
    Func _idMsgBox()
    MsgBox(0, 'Test', 'Test', 0, $idGui2)
    EndFunc ;==>_idMsgBox

    [/autoit] [autoit][/autoit] [autoit]

    Func _idZurueck()
    GUISetState(@SW_ENABLE, $idGui1) ;Gui 1 für ensablen
    GUISetState(@SW_HIDE, $idGui2) ;Gui 2 verstecken
    EndFunc ;==>_idZurueck

    [/autoit] [autoit][/autoit] [autoit]

    Func _idbtnExit2()
    _end()
    EndFunc ;==>_idbtnExit2

    [/autoit] [autoit][/autoit] [autoit]

    Func _CloseidGui2()
    GUIDelete($idGui2)
    EndFunc ;==>_CloseidGui2
    #EndRegion idGui2 Events

    [/autoit]