GUI Konzept

  • Guten Morgen,

    ich möchte eine bestehende Anwendung um ein paar Features erweitern. Hierzu möchte ich jedoch die GUI etwas ändern. Bisher hatte ich immer eine ganz einfache GUI, wo sozusagen alles auf einen Blick zu sehen war. Gerne würde ich jetzt "Frame ähnlich" eine GUI erstellen (siehe Bild)
    [Blockierte Grafik: http://www.hasenmueller.de/files4forum/gui.gif]
    jedoch fehlt mir gerade das Umsetzungskonzept im Kopf.

    Der Plan ist folgender. Die GUI startet, und Feld 1 ist mit diversen Controls belegt. Sobald ich im Feld 1 ein Control bediene, sollen unterschiedliche Inhalte (weitere Controls usw.) in Feld 2 erscheinen. Das hat logischerweise dann die Folge, das sich Feld 2 + 3 auch wieder "löschen" muss, wenn in Feld 1 ein anderes Controll gedrückt wird. Wenn dann in Feld 2 auf den Controlls Aktionen durchgeführt werden, muss das Ergebnis in Feld 3 zu sehen sein. Auch hier muss Feld 3 gelöscht werden, wenn in Feld 2 andere Controlls bedient werden.

    Wir hier mit unterschiedlichen "neuen" GUIs gearbeitet oder .... sorry ich hab gerade überhaupt keinen Plan, wie ich hier anfangen soll. Wie erzeuge ich meine Felder und wie übergebe und lösche ich die anzusprechenden neuen Felder. Über ein kleines Samplescript würde ich mich sehr freuen :)

    Gruss und Danke

  • Ich beginne meist damit, dass ich mir alle Controls erstelle die ich in Frame 1 brauche. Dann die passenden zu Frame 2 und 3. Sollten die von Frame 2 und 3 abhängig von der Auswahl des ersten Frames sein, so erstelle ich Quasi die Controls in Frame Zwei passend zum Control 1 in Frame 1 und sofern ich da einen Teil fertig habe kommentiere ich die erst immer aus (alternativ halt sofort Show/Hide-Funktionen schreiben und richtig implementieren). Dann beginne ich mir diese zu gruppieren. Angenommen die Controls der jeweiligen Frames sind immer die gleichen dann würde ich das z.B. so machen:

    Beispiel:

    [autoit]


    Func _ShowCtrls_Frame1()
    GUICtrlSetState($iControlID, $GUI_SHOW)
    EndFunc
    Func _HideCtrls_Frame1()
    GUICtrlSetState($iControlID, $GUI_HIDE)
    EndFunc
    Func _ShowCtrls_Frame2()
    GUICtrlSetState($iControlID, $GUI_SHOW)
    EndFunc
    Func _HideCtrls_Frame2()
    GUICtrlSetState($iControlID, $GUI_HIDE)
    EndFunc
    Func _ShowCtrls_Frame3()
    GUICtrlSetState($iControlID, $GUI_SHOW)
    EndFunc
    Func _HideCtrls_Frame3()
    GUICtrlSetState($iControlID, $GUI_HIDE)
    EndFunc

    [/autoit]


    alternativ einfach noch ein paar Ebenen mehr verschachteln...

    Ich hatte jetzt einige male schon das Problem das ich eine GUI in eine GUI implementieren musste, wie im derzeitigen Projekt auch wieder. Das wäre natürlich auch noch eine Möglichkeit, allerdings würde ich die glaub ich nur nutzen wenn es keinen anderen weg gibt ^^

    So Far

    Grüße Yaerox

    Grüne Hölle

  • Möchtest du das alles innerhalb einer GUI machen? Weil sonst könntest du eine Parent GUI als Feld 1 erstellen und 2 und 3 als Child-GUI's, die du dann jenachdem was du grade brauchst mit @SW_SHOW und @SW_HIDE aufrufst, bzw wieder versteckst ;)

    Edit: Da war wohl jemand schneller... Witzig, dass 2 Leute genau gleichzeitig nach 22 Minuten antworten und davor alles still war :D

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Also ich würde auch die Parent-Child Möglichkeit nehmen. Und das ganze im OnEvent-Mode.
    Die Farben dienen nur zur Darstellung der ganzen Seiten die es dann gibt.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGuiMain, $cPage1, $cPage2, $cPage3
    Global $hGuiPage1
    Global $hGuiPage2
    Global $hGuiPage3
    Global $hCurrPage = 0

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

    $hGuiMain = GUICreate("Test", 800, 600)
    $cPage1 = GUICtrlCreateButton("Seite 1", 20, 100, 80, 25)
    $cPage2 = GUICtrlCreateButton("Seite 2", 20, 140, 80, 25)
    $cPage3 = GUICtrlCreateButton("Seite 3", 20, 180, 80, 25)

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

    $hGuiPage1 = GUICreate("", 600 , 500, 150, 50, $WS_CHILD, Default, $hGuiMain)
    GUISetBkColor(0xFF0000)
    $hGuiPage2 = GUICreate("", 600 , 500, 150, 50, $WS_CHILD, Default, $hGuiMain)
    GUISetBkColor(0x00FF00)
    $hGuiPage3 = GUICreate("", 600 , 500, 150, 50, $WS_CHILD, Default, $hGuiMain)
    GUISetBkColor(0x0000FF)

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

    GUISetState(@SW_SHOW, $hGuiMain)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hGuiMain)
    GUICtrlSetOnEvent($cPage1, "_ShowPage")
    GUICtrlSetOnEvent($cPage2, "_ShowPage")
    GUICtrlSetOnEvent($cPage3, "_ShowPage")

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

    While 1
    Sleep(10)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _ShowPage()
    If $hCurrPage <> 0 Then GUISetState(@SW_HIDE, $hCurrPage)
    Sleep(200)
    Switch @GUI_CtrlId
    Case $cPage1
    GUISetState(@SW_SHOW, $hGuiPage1)
    $hCurrPage = $hGuiPage1
    Case $cPage2
    GUISetState(@SW_SHOW, $hGuiPage2)
    $hCurrPage = $hGuiPage2
    Case $cPage3
    GUISetState(@SW_SHOW, $hGuiPage3)
    $hCurrPage = $hGuiPage3
    EndSwitch
    EndFunc

    [/autoit]


    Wenn du das machst wie bei YaeroxXO, dann müsstest du alle Controls in Arrays packen, damit der Code beim hiden und showen nicht ellenlang wird. Und je mehr Controls du dann hast pro Frame, desto länger dauert das hiden und showen und siehst dann möglicherweise wie die Controls nacheinander gehidet werden bzw. geshowded.

  • Wenn du das machst wie bei YaeroxXO, dann müsstest du alle Controls in Arrays packen, damit der Code beim hiden und showen nicht ellenlang wird. Und je mehr Controls du dann hast pro Frame, desto länger dauert das hiden und showen und siehst dann möglicherweise wie die Controls nacheinander gehidet werden bzw. geshowded.

    Da haste auch recht ;) Kommt auf den Anwendungsfall an denke ich, also in meinem Fall müsste ich alternativ 5 ChildGUIs schreiben, was mir wiederum zu aufwendig ist da es bei mir nur ~15 Controls sind ^^

    Grüße Yaerox

    Grüne Hölle

  • Hallo Ihr 3

    erst mal vielen Dank für die Info. Ich habe mich jetzt mal in das Script von m-obi eingelesen und denke das ich es verstanden habe. Jetzt werde ich das mal mit 3 Frames testen und dann richtig umsetzen.
    Ich lasse den Thread mal offen, vielleicht kommt noch die eine oder andere Frage :)

    Gruss Hassan

    • Offizieller Beitrag

    Wieso das Rad neu erfinden? Im EN-Forum gibt es dazu eine fertige UDF ;)
    http://www.autoitscript.com/forum/topic/14…sion-19-oct-12/

  • Raupi : Das ist nicht ganz das was ich suche (aber vielleicht bin ich auch zu Betriebsblind) :)

    Egal, bin auf einen für mich guten Weg, allerdings habe ich jetzt folgendes Problem.

    Als erstes habe ich meine gesamte GUI gebaut und den 1. Frame sozusagen mit GUICtrlCreateTreeView bestückt. Wenn ich hier verschiedene Optionen anklicke bekomme ich im 3. Hauptframe diverse Texte angezeigt (also zur Übung).
    Jetzt wollte ich mal einen Button und eine Checkbox im 2. Frame erzeugen. Hierbei fällt mir folgendes auf. Ich habe den 2. Frame mit eine großen farbigen Label als Hintergrund belegt.

    [autoit]


    ; Erstelle den oberen 2. Frame
    $FrameOben = GUICtrlCreateLabel("", 241, 0, @DesktopWidth - 241, 91, $SS_SUNKEN); $FrameOben wird erstellt - als Label
    GUICtrlSetBkColor($FrameOben, 0xDDDDDD) ; Hintergrundfarbe für $FrameOben

    [/autoit]


    Wenn ich den Button und die Checkbox erzeuge, kann ich diese nicht bedienen (also es kann in der Checkbox nichts angehakt werden und Button geht nicht runter). Wenn ich den Label nicht erzeugen lasse, dann geht alles.

    Wie hängt das zusammen, bzw. wie kann ich das technisch umgehen ?

    Nachtrag!
    So habe ich es bis jetzt am Laufen:

    [autoit]


    $FrameOben = GUICtrlCreateLabel("", 241, 0, @DesktopWidth - 241, 91); $FrameOben wird erstellt - als Label
    GUICtrlSetStyle($FrameOben, BitOR($SS_LEFT, $SS_WHITEFRAME))

    [/autoit]

    Einmal editiert, zuletzt von HassanMullah (28. Juni 2013 um 16:46)

    • Offizieller Beitrag
    Zitat

    Raupi : Das ist nicht ganz das was ich suche (aber vielleicht bin ich auch zu Betriebsblind) :)


    Hast du dir wirklich alle Beispiele angesehen?

    Zitat

    Wenn ich den Label nicht erzeugen lasse, dann geht alles.

    Wie hängt das zusammen, bzw. wie kann ich das technisch umgehen ?

    Nach dem erstellen des Labels, muß es deaktiviert werde, sonst fäng es die klicks ab.

    [autoit]

    GUICtrlSetState($FrameOben , $GUI_DISABLE)

    [/autoit]