Wechsel zwischen mehreren GUIs / Tabs

  • Hallo Community,

    ich arbeite gerade an einem etwas größeren Projekt.
    In dem Projekt mögchte ich mehrere GUIS erzeugen von der jedoch vorerst nur eine angezeigt wird.
    Alle GUIs haben das selbe Hintergrundbild und sollen nach einem Klick auf diverse Buttons aktiviert bzw. daktiviert werden.

    Das ganze kann man sich sozusagen als Reiter vorstellen wie sie aus diversen Programmen beklannt sind.

    Jetzt stoße ich leider an meine Grenzen, da ich nicht weiß wie ich einen schönen Übergang zwischen den GUIs hinbekomme.
    Wenn ich die erste mit @SW_HIDE verstecke und die zweite mit @SW_SHOW zeige kommt es zu einem sehr unschönen Flackern.

    Auch probiert habe ich :

    [autoit]


    GuiSetState(@SW_SHOW, $gui_1)
    WinSetTrans("gui2",0)
    for $i = 1 to 255 Step 1
    WinSetTrans("gui2",$i
    for $h = 255 to 0 Step -1
    WinSetTrans("gui1", $h)
    Next
    Next

    [/autoit]

    Hierbei wird aber nur die erste GUI sehr langsam heruntergedimmt. Die zweite Gui taucht gar nicht auf.
    Hat jemand eine Idee wie ich den Gui-Wechsel eleganter realisieren könnte oder ob ich das ganze evtl. anders angehen sollte?

    Danke & Gruß

    Edit:

    Ich hänge mal noch den ganzen QT und die wichtige ini (umbenennen ins lamps.ini) mit an:


    [autoit]

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

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

    #cs
    ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: johannes

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

    Script Function:
    Control FS20 Receivers

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

    ----------------------------------------------------------------------------
    #ce

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

    $lamps_ini = "lamps.ini"
    $rooms_ini = "rooms.ini"
    $sidewindow = GuiCreate("Steuerung2",800,480,10,10,$WS_POPUP)
    GuiSetState(@SW_SHOW,$sidewindow)
    ;~ WinSetTRans("Steuerung2","",0)
    GuiCtrlCreatePic(".\images\background.bmp",0,0,800,480)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    GuiCtrlCreateLabel("gui2",200,200)

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

    $mainwindow = GuiCreate("Steuerung",800,480,10,10,$WS_POPUP)
    GuiSetState(@SW_SHOW,$mainwindow)
    GuiCtrlCreatePic(".\images\background.bmp",0,0,800,480)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    $time = GuiCtrlCreateLabel("",360,13,72,14)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont($time,10,800,0,"Verdana",2)
    GUICtrlSetColor($time, 0xFFFFFF)

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

    HotKeySet("^q", "Terminate")
    $lamps_room1 = IniReadSectionNames($lamps_ini)
    Dim $lamps_info[$lamps_room1[0]+1][7]
    $minute = ""
    $notify = GuiCtrlCreatePic("",760,39,29,29)
    $notify_state = "off"
    $tooltip_notify=""
    GuiCtrlSetImage(-1,".\images\notify_off.bmp")
    ;~ $rooms_info = IniRead
    set_clock()

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

    for $i = 1 to $lamps_room1[0]
    $aktuelle_sektion = IniReadSection($lamps_ini,$lamps_room1[$i])
    $lamps_info[0][0] = $lamps_info[0][0] + 1
    $lamps_info[$i][0] = GUICtrlCreatePic("",$aktuelle_sektion[1][1],$aktuelle_sektion[2][1],100,45)
    GuiCtrlSetImage($lamps_info[$i][0],".\images\button_red.bmp")
    $lamps_info[$i][1] = $aktuelle_sektion[3][1]
    $lamps_info[$i][2] = "off"
    $lamps_info[$i][3] = GuiCtrlCreateLabel($aktuelle_sektion[4][1],$aktuelle_sektion[1][1]+13,$aktuelle_sektion[2][1]+16,75,12,$SS_CENTER)
    $lamps_info[$i][4] = $aktuelle_sektion[4][1]
    $lamps_info[$i][5] = $aktuelle_sektion[5][1]
    $lamps_info[$i][6] = $aktuelle_sektion[6][1]
    ;~ _arraydisplay($lamps_info)

    GUICtrlSetBkColor($lamps_info[$i][3], $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont($lamps_info[$i][3],8,800,0,"Verdana",2)
    GUICtrlSetColor($lamps_info[$i][3], 0xFFFFFF)
    Next
    $special = GuiCtrlCreateButton("btn",700,400)

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

    while 1
    $msg = GUIGetMsg()

    Switch $msg
    case $GUI_EVENT_CLOSE
    Exit
    case $special
    ;~ Funktion switch_buttons aufrufen und "Zeile" des anzuschaltenden Buttons übergeben,
    ;~ den dazugehörigen master ermitteln und übergeben und fixed_mode auf true setzen um
    ;~ auschalten eines bereits angeschalteten Buttons zu verhindern

    ;~ for $i = 255 to 0 Step -1
    ;~ WinSetTrans("Steuerung","",$i)
    ;~ Next
    GuISwitch(
    GuiSetState(@SW_SHOW,$sidewindow)
    GuiSetState(@SW_HIDE,$mainwindow)
    ;~ GuiSetState(@SW_SHOW,$sidewindow)
    ;~ switch_buttons(4, get_master($lamps_info[4][5]), true)
    EndSwitch
    for $i = 1 to $lamps_info[0][0]
    Switch $msg
    Case $lamps_info[$i][0]
    SoundPlay("click.wav")
    ;~ Gibt die Zeile des zu der Gruppe gehörenden "masters" zurück
    $master = get_master($lamps_info[$i][5])
    ;~ "Zeile" des gedrückten Buttons und "master" (s.o.) werden übergeben
    switch_buttons($i, $master, false)
    set_notify()


    EndSwitch
    Next


    set_clock()
    WEnd

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

    func Terminate()
    Exit 0
    EndFunc

    func set_notify()


    ;~ Alle Lampen durchgehen
    for $i = 1 to $lamps_info[0][0]
    ;~ Wenn der Status irgendeiner Lampe auf "on" steht...
    If $lamps_info[$i][2] == "on" Then
    $tooltip_notify = $tooltip_notify&$lamps_info[$i][1]&" "
    Else
    $tooltip_notify = ""
    EndIf
    Next
    If $tooltip_notify <> "" Then
    If $notify_state == "off" Then
    GuiCtrlSetImage($notify,".\images\notify_on.bmp")
    $state = "on"
    EndIf

    Else
    If $notify_state == "on" Then
    GuiCtrlSetImage($notify,".\images\notify_off.bmp")
    $state = "off"
    EndIf
    EndIf
    EndFunc


    func set_clock()
    Dim $Wochentag[7] = ["So","Mo","Di","Mi","Do","Fr","Sa"]

    If $minute <> @MIN Then
    GuiCtrlSetData($time,$Wochentag[@WDAY - 1]&", "&@HOUR&":"&@MIN)
    $minute = @MIN
    EndIf
    EndFunc

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

    func get_master($groupid)
    ;~ Alle Lampen durchgehen
    for $i = 1 To $lamps_info[0][0]
    ;~ Wenn Buttons mit gleicher Group-ID...
    If $lamps_info[$i][5] == $groupid Then
    ;~ und Button "master" ist...
    If $lamps_info[$i][6] == "true" Then
    ;~ Zeile des masters nach $master speichern und zurückgeben
    $master = $i
    EndIf
    EndIf
    Next
    Return $master
    EndFunc

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

    func switch_buttons($id_button, $master, $fixed_mode=false)
    ;~ Variable für aktiven "nicht-master-button"
    $button_current=0
    ;~ Alle Lampen durchgehen
    for $i = 1 to $lamps_info [0][0]
    ;~ Wenn Button-ID ungleich der des Masters (Wenn kein master)...
    If $lamps_info[$i][0] <> $lamps_info[$master][0] Then
    ;~ und der Button in der gleichen Gruppe wie der master ist...
    If $lamps_info[$i][5] == $lamps_info[$master][5] Then
    ;~ und der Button gerade "aktiv" ist...
    If $lamps_info[$i][2] == "on" Then
    ;~ speichere die Zeile des aktiven Buttons in die Variable $button_current
    $button_current = $i
    EndIf
    EndIf
    EndIf
    Next

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

    ;~ Für alle Lampen
    for $i = 1 to $lamps_info[0][0]
    ;~ Wenn der Button in der Gleichen Gruppe wie der "master" ist...
    If $lamps_info[$i][5] == $lamps_info[$master][5] Then
    ;~ und der gedrückte Button dem gerade im Array durchlaufenen entspricht...
    If $lamps_info[$i][0] == $lamps_info[$id_button][0] Then
    ;~ und der gedrückte Button nicht der "master" ist...
    If $lamps_info[$i][0] <> $lamps_info[$master][0] Then
    ;~ und der Button gerade inaktiv ist...
    If $lamps_info[$i][2] == "off" Then
    ;~ dann setze den Button auf aktiv (bild und array)...
    GuiCtrlSetImage($lamps_info[$id_button][0],".\images\button_green.bmp")
    $lamps_info[$id_button][2] = "on"
    ;~ und setze den master auf aktiv (falls inaktiv)...
    If $lamps_info[$master][2] = "off" Then
    GuiCtrlSetImage($lamps_info[$master][0],".\images\button_green.bmp")
    $lamps_info[$master][2] = "on"
    EndIf
    ;~ Wenn bereits ein button aktiv ist (siehe button_current...)
    If $button_current <> 0 Then
    ;~ diesen auf inaktiv setzen
    GuiCtrlSetImage($lamps_info[$button_current][0],".\images\button_red.bmp")
    $lamps_info[$button_current][2] = "off"
    EndIf
    Else
    ;~ Wenn der button nicht inaktiv sondern aktiv sein sollte, setze ihn und den "master" auf inaktiv
    If $fixed_mode=False Then
    GuiCtrlSetImage($lamps_info[$id_button][0],".\images\button_red.bmp")
    $lamps_info[$id_button][2] = "off"
    GuiCtrlSetImage($lamps_info[$master][0],".\images\button_red.bmp")
    $lamps_info[$master][2] = "off"
    EndIf
    EndIf
    Else
    ;~ Wenn der gedrückte Button der "master" ist und kein anderer button aktiv ist...
    If $button_current = 0 Then
    ;~ und er gerade deaktiviert ist...
    If $lamps_info[$id_button][2] == "off" Then
    ;~ dann setze ihn auf aktiv (bild und array)
    GuiCtrlSetImage($lamps_info[$id_button][0],".\images\button_green.bmp")
    $lamps_info[$id_button][2] = "on"
    Else
    ;~ Wenn er gerade aktiv ist...
    If $lamps_info[$id_button][2] == "on" Then
    ;~ setze ihn auf inaktiv
    GuiCtrlSetImage($lamps_info[$id_button][0],".\images\button_red.bmp")
    $lamps_info[$id_button][2] = "off"
    EndIf
    EndIf
    Else
    ;~ Wenn ein anderer Button aktiv ist und somit auch der master, setze beide auf inaktiv.
    GuiCtrlSetImage($lamps_info[$id_button][0],".\images\button_red.bmp")
    $lamps_info[$id_button][2] = "off"
    GuiCtrlSetImage($lamps_info[$button_current][0],".\images\button_red.bmp")
    $lamps_info[$button_current][2] = "off"
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Hast du es mal mit GUISwitch versucht ?

    Edit: Beispiel, du hast $gui1 erstellt, und danach $gui2, jetzt ist der Focus auf
    $gui2, dann kannst du den Focus mit GuiSwitch($gui1) zu $gui1 wechseln.

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Ich habe das mal getestet aber ich denke das ist nicht das was ich suche.
    Ich habe zwei Guis die das gleiche hintergrundbild haben um sozusagen Tabs realisieren zu können.
    Drückt man in Gui einen Button der aussieht wie ein Tab, dann kommt Gui2 in den Vordergrund. Drückt man in dieser den Button kommt GUI1 zum Vordergrund.

  • Hier ein Beispiel zum gleichzitigen ein-/ausblenden:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $gui1 = GUICreate("Programm", 200, 200) ;Gui 1
    $bt1 = GUICtrlCreateButton("About", 50, 50) ;Button zur About-box
    GUISetState(@SW_SHOW, $gui1) ;GUI anzeigen

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

    $gui2 = GUICreate("About", 150, 150) ;Gui 2
    $bt2 = GUICtrlCreateButton("Schließen", 10, 10) ;Gui 2 schließen button
    WinSetTrans($gui2,"",0)
    GUISetState(@SW_SHOW, $gui2) ;GUI verstecken

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

    While 1 ;schleife
    $nMsg = GUIGetMsg(1) ;Die 1 ist wichtig
    Switch $nMsg[1] ;wertet die Guis aus
    Case $gui1 ;Wenn gui1 benutzt wird
    Switch $nMsg[0] ;wertet die ControllIds aus
    Case $bt1 ;Wenn button 1 in gui 1 gedrückt wird
    _SetTrans($gui1, $gui2)
    Case $GUI_EVENT_CLOSE ;Falls GUI 1 geschlossen
    Exit ;Skript schließen
    EndSwitch ;Ende der Switch von dem GUI 1
    Case $gui2 ;Falls gui2 benutzt wird
    Switch $nMsg[0] ;Wieder switch $nMsg und wieder mit 0
    Case $bt2, $GUI_EVENT_CLOSE ;Falls Button 2 (schließen) gedrückt wird oder Gui2 geschlossen wird(X / Alt-F4 / Esc)
    _SetTrans($gui2, $gui1)
    EndSwitch ;Ende der Switch von dem GUI 2
    EndSwitch ;Ende der switch des allem guis. du kannst so weitermachen mit x GUI's
    WEnd ;schleifenende

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

    Func _SetTrans($gui1, $gui2)
    ; GUISetState(@SW_SHOW, $gui2) ;GUI 1 anzeigen
    For $i = 1 To 255
    WinSetTrans($gui1, "", 255 - $i)
    WinSetTrans($gui2, "", $i)
    Next
    ; GUISetState(@SW_HIDE, $gui1) ;GUI 2 verstecken
    EndFunc ;==>_SetTrans

    [/autoit]

    mfg autoBert

  • autoBert: Danke, das klappt mit deinem Beispiel super.
    Wenn ich es jedoch bei mir anwende kommt es beim klick auf den Button immer noch zu unschänem einmaligen Flackern. Kann das evtl. daran liegen, dass ich ein Hintergrundbild verwende?