Embedded GUIs

  • Hallo Gemeinde,

    Ich hab mal wieder ein ein kleines Problem.

    Und zwar in folgendem Skript füge ich ein GUI in eine anderes ein, ich embedde es.

    Das ding es is kein IE Object o.ä. sondern ein selbsterzeugtes GUI. Funkst alles super bis auf das das Embedded GUI immer den Fokus und Funktionsfähigkeit des MainGUIs klaut.
    Was meine ich mit Funktionsfähigkeit, ganz einfach man kann nix mehr damit machen geschweige denn Schließen.

    Das Skript

    Spoiler anzeigen
    [autoit]


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

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

    $MainGui = GUICreate("Hallo", 500, 500, 0,0)
    $2GUI = GUICreate("2",200,200,100,100)
    GUISetState(@SW_SHOW,$MainGui)
    GUISetState(@SW_SHOW,$2GUI)

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

    _Embedded_Create($MainGui, $2GUI)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[1]
    Case $MainGui
    GUISwitch($MainGui)
    If $nMsg[0] = $GUI_EVENT_CLOSE Then Exit
    Case $2GUI
    GUISwitch($2GUI)
    If $nMsg[0] = $GUI_EVENT_CLOSE Then Exit
    EndSwitch
    WEnd

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

    ;===============================================================================
    ;
    ; Description: Bettet ein anderes Programm (.exe) in eine Gui ein
    ; Parameter(s): $hwnd - Handle der Gui
    ; $path - Pfad des zu einbettenden Programmes
    ; $title - Titel des Fensters des Programmes das eingebettet werden soll
    ; $x - X-Positon des Controls in der Gui
    ; $y - Y-Position des Controls in der Gui
    ; $width - Weite des Controls in der Gui
    ; $height - Höhe des Controls in der Gui
    ; Requirement(s): user32.dll
    ; Return Value(s): erolgreich: Control-ID für _Embedded Controls
    ; fehlgeschlagen: 0, @error auf 1
    ; Author(s): stayawayknight n bissle von mir umgeschrieben
    ;===============================================================================
    Func _Embedded_Create($MainGui, $Embedded)
    $style = DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $Embedded, "int", 236)
    DllCall("user32.dll", "int", "SetWindowLong", "hwnd", $Embedded, "int", 236, "int", BitOR($style[0], $WS_EX_MDICHILD))
    DllCall("user32.dll", "int", "SetParent", "hwnd", $Embedded, "hwnd", $MainGui)
    EndFunc ;==>_Embedded_Create

    [/autoit]

    EDIT:
    Ich hab die Befürchtung das könnte an dem fehlenden Multitasking/Threading von Autoit liegen
    Oder fahr ich in die völlig falsche Richtung
    Danke schon mal im Vorraus

    Einmal editiert, zuletzt von Omasgehstock14 (27. Juni 2011 um 22:31)

  • Probiere es mal so:

    Spoiler anzeigen
    [autoit]

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

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

    $MainGui = GUICreate("Hallo", 500, 500, 0, 0)
    $2GUI = GUICreate("2", 200, 200, 100, 100, $GUI_SS_DEFAULT_GUI, $WS_EX_MDICHILD, $MainGui)
    GUISetState(@SW_SHOW, $2GUI)
    GUISetState(@SW_SHOW, $MainGui)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[1]
    Case $MainGui
    If $nMsg[0] = $GUI_EVENT_CLOSE Then Exit
    Case $2GUI
    If $nMsg[0] = $GUI_EVENT_CLOSE Then Exit
    EndSwitch
    WEnd

    [/autoit]

    Des weiteren empfehle ich dir den OnEventModus zu benutzen (GUISetOnEvent)

  • Danke erstmal eukalyptus,

    aber es funkst immer noch nich

    Neus Skript:

    Spoiler anzeigen
    [autoit]


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

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

    $MainGui = GUICreate("Hallo", 500, 500, 0,0)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    $2GUI = GUICreate("2", 200, 200, 100, 100, $GUI_SS_DEFAULT_GUI, "", $MainGui)
    GUISetState(@SW_SHOW,$MainGui)
    GUISetState(@SW_SHOW,$2GUI)

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

    _Embedded_Create($MainGui, $2GUI)

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

    While 1
    Sleep(25)
    WEnd

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

    ;===============================================================================
    ;
    ; Description: Bettet ein anderes Programm (.exe) in eine Gui ein
    ; Parameter(s): $hwnd - Handle der Gui
    ; $path - Pfad des zu einbettenden Programmes
    ; $title - Titel des Fensters des Programmes das eingebettet werden soll
    ; $x - X-Positon des Controls in der Gui
    ; $y - Y-Position des Controls in der Gui
    ; $width - Weite des Controls in der Gui
    ; $height - Höhe des Controls in der Gui
    ; Requirement(s): user32.dll
    ; Return Value(s): erolgreich: Control-ID für _Embedded Controls
    ; fehlgeschlagen: 0, @error auf 1
    ; Author(s): stayawayknight n bissle von mir umgeschrieben
    ;===============================================================================
    Func _Embedded_Create($MainGui, $Embedded)
    $style = DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $Embedded, "int", 236)
    DllCall("user32.dll", "int", "SetWindowLong", "hwnd", $Embedded, "int", 236, "int", BitOR($style[0], $WS_EX_MDICHILD))
    DllCall("user32.dll", "int", "SetParent", "hwnd", $Embedded, "hwnd", $MainGui)
    EndFunc ;==>_Embedded_Create

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

    Func _Exit()
    MsgBox(0,"","EXIT")
    Exit
    EndFunc

    [/autoit]

    Der style $WS_EX_MDICHILD is nicht notwendig, denn wenn man ihn setzt wird das eingebettete GUI nicht nur wegen dem MAIN GUI beweg sondern zusätzlich nochmal wegen der Mausbewegung, dass heißt es bewegt sich immer doppelt so schnell wie das Original und im übrigen bewegt es sich auch ohne ganz normal.

    Weiterhin ist mir Aufgefallen, dass der MinimizeButton in Embedded GUI funktioniert aber nicht im Main GUI.

    Außerdem funktioniert bei beiden nicht der Close Button auch nicht mit deinen Verbesserungsvorschlägen.

    Und gute IDee mit dem OnEventMode is einfach übersichtlicher.

    Nochmal Danke und hoffentlich fällt euch noch was ein

    PS: was bringt der $GUI_SS_DEFAULT_GUI Style

    EDIT: Der Minimize Butten geht jetzt bei beiden

    Einmal editiert, zuletzt von Omasgehstock14 (27. Juni 2011 um 20:44)

  • puh hab ich mir schon gedacht das Autoit kein MDI unterstützt

    Aber auf jedenfall danke für den Link mach mich mal ran velleicht wirds ja was