GUI: Problem mit States

  • Hi,

    Jedesmal, wenn ich eine Child-GUI lösche, wird die Main-GUI einfach ganz in den Hintergrund gestellt. Woran liegt das? Meine Lösung funktioniert nicht immer und sieht auch unschön aus:

    Spoiler anzeigen
    [autoit]

    $h_maingui = GUICreate($S_WINTITLE, 394, 375, -1, -1)
    [...]
    $h_settingsgui = GUICreate($S_APPTITLE & ": Settings", 240, 240, -1, -1, $WS_CAPTION + $WS_SYSMENU, -1, $h_maingui)
    [...]
    GUISetState(@SW_DISABLE, $h_maingui)
    GUISetState(@SW_SHOW, $h_settingsgui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    EndSelect
    WEnd
    GUIDelete($h_settingsgui)
    GUISetState(@SW_ENABLE, $h_maingui)
    WinActivate($S_WINTITLE, "")
    [...]

    [/autoit]
  • Klar doch, sorry:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    $S_WINTITLE = "Main GUI"

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

    $h_maingui = GUICreate($S_WINTITLE, 394, 375, -1, -1)
    $h_settingsbt = GUICtrlCreateButton("&Settings", 10, 10)

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

    GUISetState(@SW_SHOW, $h_maingui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    Case $a_msg[0] == $h_settingsbt
    GUISetState(@SW_DISABLE, $h_maingui)
    $h_settingsgui = GUICreate("Settings GUI", 240, 240, -1, -1, $WS_CAPTION + $WS_SYSMENU, -1, $h_maingui)

    GUISetState(@SW_SHOW, $h_settingsgui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    EndSelect
    WEnd
    GUIDelete($h_settingsgui)
    GUISetState(@SW_ENABLE, $h_maingui)
    ;~ WinActivate($S_WINTITLE, "")
    EndSelect
    WEnd
    GUIDelete($h_maingui)
    Exit(0)

    [/autoit]

    Wenn man die auskommentierte Zeile einfügt, so zuckt das Fenster (logisch) und manchmal (bei einem anderen Skript) funktioniert es auch nicht.

  • Das selbe Problem hab ich bei meinen Programmen auch immer und bin mittlerweile dazu übergegangen das Disablen einfach wegzulassen^^
    Würde mich aber interessieren, ob das jemand gelöst kreigt ^^

  • teh_hahn:
    wenn ich dich richtig verstanden habe, dann habe ein ähnliches problem mal mit folgendem trick gelöst:

    setz in zeile 28 in deinem code doch mal das hier ein:

    [autoit]

    GUISetState(@SW_RESTORE, $h_maingui)

    [/autoit]


    sollte das klappen, wir deine maingui wieder in den vordergrund gezogen. unschön ist nur, dass sie kurz aufblitzt.

    Edit: sehe grad, es macht keinen großen unterschied zu deiner WinActivate-Lösung. sollte aber eigentlich immer funktionieren. ist halt nur nicht formvollendet schön.

    Einmal editiert, zuletzt von unearth (19. Juli 2007 um 23:44)

    • Offizieller Beitrag

    Hallo!

    Also, gehen tut es, aber ich würd sagen nur mit dem Style $WS_EX_TOPMOST
    Also ca so:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

    $S_WINTITLE = "Main GUI"

    $h_maingui = GUICreate($S_WINTITLE, 394, 375, -1, -1)
    $h_settingsbt = GUICtrlCreateButton("&Settings", 10, 10)

    GUISetState(@SW_SHOW, $h_maingui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    Case $a_msg[0] == $h_settingsbt
    WinSetOnTop($h_maingui,"",1)
    GUISetState(@SW_DISABLE, $h_maingui)
    $h_settingsgui = GUICreate("Settings GUI", 240, 240, -1, -1, $WS_CAPTION + $WS_SYSMENU,$WS_EX_TOPMOST, $h_maingui)

    GUISetState(@SW_SHOW, $h_settingsgui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    EndSelect
    WEnd
    GUIDelete($h_settingsgui)
    WinActivate($S_WINTITLE, "")
    GUISetState(@SW_ENABLE, $h_maingui)
    WinSetOnTop($h_maingui,"",0)
    EndSelect
    WEnd
    GUIDelete($h_maingui)
    Exit(0)

    [/autoit]

    Is natürlich dumm, wenn du das fenster nicht topmost haben willst^^

    Mfg Spider

    • Offizieller Beitrag

    Hallo,

    die Lösung ist recht einfach, man muss nur das Hauptfenster wieder @SW_ENABLE setzen bevor man das Child-Fenster löscht!

    [autoit]

    #include <GUIConstants.au3>

    $S_WINTITLE = "Main GUI"

    $h_maingui = GUICreate($S_WINTITLE, 394, 375, -1, -1)
    $h_settingsbt = GUICtrlCreateButton("&Settings", 10, 10)

    GUISetState(@SW_SHOW, $h_maingui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    Case $a_msg[0] == $h_settingsbt
    GUISetState(@SW_DISABLE, $h_maingui)
    $h_settingsgui = GUICreate("Settings GUI", 240, 240, -1, -1, $WS_CAPTION + $WS_SYSMENU, -1, $h_maingui)

    GUISetState(@SW_SHOW, $h_settingsgui)
    While 1
    $a_msg = GUIGetMsg(1)
    Select
    Case $a_msg[0] == $GUI_EVENT_CLOSE
    ExitLoop 1
    EndSelect
    WEnd
    GUISetState(@SW_ENABLE, $h_maingui)
    GUIDelete($h_settingsgui)
    ;~ WinActivate($S_WINTITLE, "")
    EndSelect
    WEnd
    GUIDelete($h_maingui)
    Exit(0)

    [/autoit]