"Master" und "Slave"-Fenster EDIT: und FensterRahmen entfernen...

  • Hi Leute:
    hab mal wieder ne Frage und im Netz nicht die Antwort gefunden,...:(
    Folgendes:

    Ich erzeuge ein Fenster, welches ein Button enthält! Wenn ich Diesen betätige, öffnet sich ein neues Fenster, das sich in den Vordergund stellt und das andere Fenster "UnAnKlickBar" macht...
    (hoffe, ich habs verständlich ausgedrückt)
    man kann es zwar noch sehen, aber damit solange nicht interagieren, bis man das 2te Fenster wieder geschlossen hat.. 8|

    Freue mich über eure Antworten..;) :rock:

    2 Mal editiert, zuletzt von Mr_gitarre (21. März 2010 um 16:19)

  • Du musst einfach die GUI, die "Unanklickbar" seien soll mit:

    [autoit]

    GuiSetState($GUI, @SW_DISABLE); Unanklickbar
    GuiSetState($GUI, @SW_ENABLE); wieder anklickbar

    [/autoit]


    versehen. Bei dem Schließen der anderen Gui einfach den anderen Status setzen!

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Na das is ja geil...!!:D
    Vielen dank für die schnelle antwort, werde sie gleich ausprobieren...:D


    Noch ne kleine andere frage: weiß jemand den Befehl, um die Leiste oben zu entfernen, das Fenster sozusagen RANDLOS zu machen..?

    man kann also weder an die Symbole: schließen, Gloß und Kleinmachen ran, noch die Größe des Fensters durch ziehen des Randes ändern...! :huh:

    vielen dank für eure antworten :)

    EDIT:
    hab deine Befehle ausprobiert und kommt leider nix bei raus, beide sind immernoch anklickbar:
    was mache ich falsch??

    Programm:

    2 Mal editiert, zuletzt von Mr_gitarre (21. März 2010 um 13:57)

  • Hier mal ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Testgui", 200,200, -1,-1, $WS_Popup, $WS_EX_TOPMOST)
    $Button1=GUICtrlCreateButton("Nutzloser Button",40,85,120,30)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1

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

    EndSwitch
    WEnd

    [/autoit]

    (Falls du die Eigenschaften $WS_Popup und $WS_Ex_Topmost in deiner GUI verwenden willst, vergiss das Include
    von WindowsConstants.au3 nicht. Oder nimm für $WS_Popup einfach den Wert: 0x80000000 und für $WS_Ex_Topmost
    den Wert: 0x00000008 !)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • (Falls du die Eigenschaften $WS_Popup und $WS_Ex_Topmost in deiner GUI verwenden willst, vergiss das Include
    von WindowsConstants.au3 nicht. Oder nimm für $WS_Popup einfach den Wert: 0x80000000 und für $WS_Ex_Topmost
    den Wert: 0x00000008 !)


    Ich hab keine ahnung wovon du da redest... Bin ja auch ein blutiger anfänger: kannst du mir das erklähren?? :S

  • Und hierbei weiß ich nicht, welcher von den Befehlen nu dafür verantwortlich ist, dass der Rahmen weg ist...! (was bedeutet eigentlich die -1, -1 beim Fenster??)

  • Die Variablen $WS_Popup und $WS_Ex_Topmost sind beide Konstanten (sie ändern ihren Wert nicht).
    Du musst eine GUI mit dem Style der beiden erstellen.
    Da die Variablen $WS_Popup und $WS_Ex_Topmost nicht Standardmäßig deklariert (also noch nicht bekannt) sind,
    musst du den beiden Variablen entweder einen Wert zuweisen ODER die WindowsConstants.au3 einfügen (via #include),
    da sie in der WindowsConstants.au3 bereits die Werte zugewiesen bekommen haben.

    [autoit]

    ;Entweder:
    $WS_Popup = 0x80000000
    $WS_Ex_Topmost = 0x00000008

    ;Oder (natürlich ohne das Vorausgehende Komma):
    ;#include <WindowsConstants.au3>


    GuiCreate("GUIname",500,500,-1,-1, $WS_Popup, $WS_Ex_Topmost)
    guisetstate()
    while guigetmsg() <> -3
    sleep(10)
    wend

    [/autoit]


    Es ist egal ob du die Variablen manuell deklarierst oder einfach die fertigen Werte mit dem #Includebefehl einfügst.
    (Wobei du bei dem #Includebefehl noch mehr Konstanten übernimmst, was vielleicht sinnvoll für die Arbeit mit der GUI seien kann.)
    PS: Der KODA (fd.exe im AutoItverzeichnis\Scite\Koda) fügt meistens die benötigten Includes automatisch hinzu!

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Na die Erklährung war einfach mal Traumhaft!!!!

    Eine Frage noch!:
    $Ws_Ex_Topmost -) zuständig für Die Button Schließen, Groß und Kleinmachen
    und
    $WS_popup -) nimmt den Rand weg, richtig?

  • Zitat von Mr_gitarre

    Eine Frage noch!:
    $Ws_Ex_Topmost -) zuständig für Die Button Schließen, Groß und Kleinmachen
    und
    $WS_popup -) nimmt den Rand weg, richtig?

    falsch siehe Deutsche Hilfe

    Zitat

    $WS_EX_TOPMOST Legt fest, dass ein Fenster mit diesem Stil vor allen anderen Fenstern platziert werden soll und auch dann das vorderste Fenster bleibt, selbst wenn das Fenster deaktiviert wird.

    der Stil $WS_popup alleine ergibt alles was du oben beschrieben hast,

    mfg (Auto)Bert

  • Ergibt nen Sinn... alles klar: verstanden;)
    dank euch!

    und die sache mit dem "Master" und "Slave"-Fenster??

    was mache ich falsch??

  • Ich hab mal nen Testscript mit allen geforderten Eigenschaften erstellt ;) :

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>; hier steht die Variable $Gui_Event_Close, $Gui_Enable und $Gui_Disable drin
    ; und natürlich noch viele weitere Events, die ausgewertet werden können
    #include <Windowsconstants.au3>; hier steht die variable $WS_Popup drin
    $Gui1 = GUICreate("Gui 1", 400, 400, 0, 0)

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

    $an = 0; für die GUI verantwortlich, ob sie "an" (=sichtbar) ist
    $anklickbar = 1; für den Button2GUI2 verantwortlich, ob er anklickbar ist (1=ja)

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

    $ButtonGui1 = GUICtrlCreateButton("GUI an", 100, 100, 100, 25)
    $Gui2 = GUICreate("Gui 2", 200, 400, 411, 20, $WS_Popup); Randlose GUI anfangs unsichtbar
    $ButtonGui2 = GUICtrlCreateButton("Nicht anklickbar", 50, 100, 100, 25); Button auf gui2
    $Button2Gui2 = GUICtrlCreateButton("Nutzloser Button", 50, 150, 100, 25); Button auf gui2
    GUISetState(@SW_SHOW, $Gui1); Gui 1 wird sichtbar

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

    While 1
    $msg = GUIGetMsg(); Guinachrichten werden gespeichert in msg
    Switch $msg; je nachdem wie die Nachricht ausfällt, wird der jeweilige fall angesprochen
    Case $ButtonGui1
    $an = Not $an; Wenn Sichtbarkeit an war, dann wird Sichtbarkeit ausgeschaltet(und andersrum)
    If $an = 0 Then; Wenn gui2 sichtbar war, dann wird gui2 unsichtbar
    GUISetState(@SW_HIDE, $Gui2); Gui wird versteckt
    GUICtrlSetData($ButtonGui1, "Gui an"); Buttontext wird angepasst
    Else
    GUISetState(@SW_SHOW, $Gui2); Gui wird angezeigt
    GUICtrlSetData($ButtonGui1, "Gui aus") ;Buttontext wird angepasst
    EndIf

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

    Case $GUI_EVENT_CLOSE; Falls gui geschlossen wird
    Exit
    Case $ButtonGui2
    $anklickbar = Not $anklickbar; Wenn der Button anklickbar war, ist er es nun NICHT mehr (und andersrum)
    If $anklickbar = 1 Then
    GUICtrlSetState($Button2Gui2, $Gui_Enable); Button2Gui2 wird anklickbar
    GUICtrlSetData($ButtonGui2, "Nicht anklickbar"); Buttontext wird angepasst
    Else
    GUICtrlSetState($Button2Gui2, $gui_Disable); Button2Gui2 wird NICHT mehr anklickbar
    GUICtrlSetData($ButtonGui2, "anklickbar"); Buttontext wird angepasst

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

    EndIf
    EndSwitch
    Sleep(10); damit der Prozessor sich nicht überarbeitet
    WEnd

    [/autoit]


    Ich habs recht ausführlich erklärt mit Kommentaren (vielleicht helfen sie etwas :D )
    PS: die Position (4ter und 5ter Parameter bei Guicreate()) -1, -1 gibt an, dass die gui zentriert (Bildschirmmitte) angezeigt werden soll!

    //Edit: Damit die gesamte GUI "unanklickbar" ist, muss man nicht nur:

    [autoit]

    GUICtrlSetState($Button2Gui2, $gui_Disable); Nur der Button wird unanklickbar

    [/autoit]


    sondern:

    [autoit]

    guisetstate(@sw_Disable, $Gui2)

    [/autoit]


    verwenden!

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Boa, Wie geil...

    Und die Kommentare!!!

    Einfach mal TRAUMHAFT!!!!!!

    also war auch mein Befehl falsch, den ich eingeben wollte...!

    und am ende: sleep(10) ; damit der Prozessor nicht überlastet wird..?
    Warum? Sollte man das so immer schreiben, wenn man ne schleife hat??

  • Ich wollte jetzt auch mal meinen Senf zugeben ;)

    Spoiler anzeigen
    [autoit]

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

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

    $hGuiMaster = GUICreate("Master GUI", 200, 200, 50, -1, $WS_POPUP)
    $hCloseMaster = GUICtrlCreateButton("Master GUI schließen", 30, 50, 120, 25)
    $hOpenSlave = GUICtrlCreateButton("Slave GUI öffnen", 30, 100, 120, 25)
    GUISetState()

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

    $hGuiSlave = GUICreate("Slave GUI", 200, 200, 300, -1, $WS_POPUP, -1, $hGuiMaster)
    $hCloseSlave = GUICtrlCreateButton("Slave GUI schließen", 30, 50, 120, 25)
    GUISetState(@SW_HIDE)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $hCloseMaster
    Exit
    Case $hOpenSlave
    _SlaveGui()
    EndSwitch
    WEnd

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

    Func _SlaveGui()
    GUISetState(@SW_DISABLE, $hGuiMaster)
    GUISetState(@SW_SHOW, $hGuiSlave)
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $hCloseSlave
    GUISetState(@SW_ENABLE, $hGuiMaster)
    GUISetState(@SW_HIDE, $hGuiSlave)
    Return
    EndSwitch
    WEnd
    EndFunc

    [/autoit]

    Edit: Also meiner Meinung nach packt man nur ein Sleep in eine völlig leere While-Schleife rein, damit der keine 100%-Auslastung hat. Aber bei dir steht ja genug drin, da hat der Prozessor keine 100%-Auslastung.

    • Offizieller Beitrag

    XovoxKingdom: an sich schön erklärt, nur diese Zeile

    [autoit]

    Sleep(10); damit der Prozessor sich nicht überarbeitet

    [/autoit]


    ist in einer GUIGetMsg-Schleife überflüssig bzw. sogar kontraproduktiv (weil GUIGetMsg in dieser Zeit nicht abgefragt wird).
    Die Prozessorlast wird im MessageLoop-Modus automatisch geregelt:

    Zitat

    This function automatically idles the CPU when required so that it can be safely used in tight loops without hogging all the CPU.

    Beim OnEvent-Mode hingegen ist der Sleep-Befehl wichtig, weil dort in der Endlosschleife sonst der Prozessor ausgelastet würde.