Parent- und Child-GUI

  • Hi,

    habe schon sowohl das englische, als auch das deutsche Forum durchgegrast...

    Folgendes Problem:

    Ich habe zwei GUIs (eine Parent und eine Child) und möchte nun, dass die Child-GUI an die Parent-GUI "angeheftet" wird. Mein bisheriger Code sieht so aus:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("MustDeclareVars", 1)

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

    Local $h_parentgui = -1, $a_parguipos = -1, $h_childgui = -1

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

    $h_parentgui = GUICreate("Parent GUI", 640, 265, -1, -1, $WS_BORDER)
    $a_parguipos = WinGetPos("Parent GUI")
    $h_childgui = GUICreate("Child GUI", $a_parguipos[2] - 6, 71, $a_parguipos[0], $a_parguipos[1] + $a_parguipos[3], $WS_DLGFRAME + $WS_POPUP, Default, $h_parentgui)

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

    GUISetState(@SW_SHOW, $h_parentgui)
    GUISetState(@SW_SHOW, $h_childgui)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Zuerst einmal missfällt mir die Lösung mit WinGetPos sehr. Gibt es eine andere Möglichkeit, die Child-GUI direkt an die Parent-GUI zu bekommen?
    In diesem Zusammenhang sind mir die Common Styles $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS und $WS_CHILD aufgefallen. Sehe da aber grade nicht wirklich durch. Auch der Extended Style $WS_EX_MDICHILD bringt mich irgendwie nicht weiter.
    Dadurch bedingt, wird die Child-GUI natürlich nicht mit bewegt, wenn ich die Parent-GUI bewege.

    Wer sich jetzt fragt, wozu ich das Ganze mache: Ich möchte die Child-GUI mittels Animation Ein- und Ausblenden, weswegen ich nicht einfach ein Control benutzen kann!

    • Offizieller Beitrag

    Ich denke, das ist in etwa das was du möchtest. Ich habe die Child-GUI aber "drauf"geheftet.
    Bewegst du die Parent, wird die Child mitbewegt.

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    Global Const $WS_EX_CONTROLPARENT = 0x00010000

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

    $ParentGUI = GUICreate("AForm1", 600, 220, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
    GUISetBkColor(0xB4B4B4)
    $Label1 = GUICtrlCreateLabel("Parent Window", 8, 0, 77, 17)
    GUICtrlSetBkColor(-1, 0xB4B4B4)
    GUISetState(@SW_SHOW)

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

    $ChildGUI = GUICreate("", 600, 100, -2, 120, BitOR($WS_CHILD, $WS_TABSTOP, $WS_SIZEBOX), $WS_EX_CONTROLPARENT, $ParentGUI)
    $Label1 = GUICtrlCreateLabel("Child Window", 8, 0, 77, 17)
    GUISetState(@SW_SHOW)

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

    GUISwitch($ParentGUI)

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

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

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

    EndSwitch
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Hi,

    anderes Beispiel

    [autoit]

    #include <GuiConstants.au3>
    $Main_GUI = GUICreate("Main")
    $Btn_Exit = GUICtrlCreateButton("E&xit", 10, 10, 90, 20)
    GUISetState(@SW_SHOW, $Main_GUI)
    $Child_GUI = GUICreate("Child", 200, 100, 10, 50, $WS_CAPTION)
    GUISetBkColor(0xfffaf0, $Child_GUI)
    $Btn_Test = GUICtrlCreateButton("Test", 10, 10, 90, 20)
    GUISetState(@SW_SHOW, $Child_GUI)
    DllCall("user32.dll", "int", "SetParent", "hwnd", WinGetHandle($Child_GUI), "hwnd", WinGetHandle($Main_GUI))

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $Btn_Exit
    Exit
    Case $Btn_Test
    MsgBox(0, "Test", "Hit Button on Child Window")
    EndSwitch
    WEnd

    [/autoit]

    So long,

    Mega

  • Hi,

    danke für Eure Antworten. Sieht beides sehr gut aus, bloß bekomme ich es mit Euren Styles nicht hin, dass auch eine Animation funktioniert. Hier mal mein vollständiger Code, wie das Ganze nachher aussehen (und funktionieren) soll. Ist aber halt voll zusammengebastelt, da die GUIs nicht "aneinander kleben"...

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("MustDeclareVars", 1)

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

    Global Const $AW_FADE_IN = 0x00080000 ;fade-in
    Global Const $AW_FADE_OUT = 0x00090000 ;fade-out
    Global Const $AW_SLIDE_IN_LEFT = 0x00040001 ;slide in from left
    Global Const $AW_SLIDE_OUT_LEFT = 0x00050002 ;slide out to left
    Global Const $AW_SLIDE_IN_RIGHT = 0x00040002 ;slide in from right
    Global Const $AW_SLIDE_OUT_RIGHT = 0x00050001 ;slide out to right
    Global Const $AW_SLIDE_IN_TOP = 0x00040004 ;slide-in from top
    Global Const $AW_SLIDE_OUT_TOP = 0x00050008 ;slide-out to top
    Global Const $AW_SLIDE_IN_BOTTOM = 0x00040008 ;slide-in from bottom
    Global Const $AW_SLIDE_OUT_BOTTOM = 0x00050004 ;slide-out to bottom
    Global Const $AW_DIAG_SLIDE_IN_TOPLEFT = 0x00040005 ;diag slide-in from Top-left
    Global Const $AW_DIAG_SLIDE_OUT_TOPLEFT = 0x0005000a ;diag slide-out to Top-left
    Global Const $AW_DIAG_SLIDE_IN_TOPRIGHT = 0x00040006 ;diag slide-in from Top-Right
    Global Const $AW_DIAG_SLIDE_OUT_TOPRIGHT = 0x00050009 ;diag slide-out to Top-Right
    Global Const $AW_DIAG_SLIDE_IN_BOTTOMLEFT = 0x00040009 ;diag slide-in from Bottom-left
    Global Const $AW_DIAG_SLIDE_OUT_BOTTOMLEFT = 0x00050006 ;diag slide-out to Bottom-left
    Global Const $AW_DIAG_SLIDE_IN_BOTTOMRIGHT = 0x0004000a ;diag slide-in from Bottom-right
    Global Const $AW_DIAG_SLIDE_OUT_BOTTOMRIGHT = 0x00050005 ;diag slide-out to Bottom-right
    Global Const $AW_EXPLODE = 0x00040010 ;explode
    Global Const $AW_IMPLODE = 0x00050010 ;implode
    Global Const $AW_HOR_POSITIVE = 0x00000001
    Global Const $AW_HOR_NEGATIVE = 0x00000002
    Global Const $AW_VER_POSITIVE = 0x00000004
    Global Const $AW_VER_NEGATIVE = 0x00000008
    Global Const $AW_CENTER = 0x00000010
    Global Const $AW_HIDE = 0x00010000
    Global Const $AW_ACTIVATE = 0x00020000
    Global Const $AW_SLIDE = 0x00040000
    Global Const $AW_BLEND = 0x00080000

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

    Local Const $S_WINTITLE = "Parent GUI"
    Local $h_maingui = -1, $a_mainguipos = -1, $h_debuggui = -1, $h_debuglist = -1

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

    $h_maingui = GUICreate($S_WINTITLE, 646, 245, -1, -1, $WS_BORDER + $WS_DISABLED)
    $a_mainguipos = WinGetPos($S_WINTITLE)
    $h_debuggui = GUICreate("DebugWindow", $a_mainguipos[2] - 6, 71, $a_mainguipos[0], $a_mainguipos[1] + $a_mainguipos[3], _
    $WS_POPUP + $WS_DLGFRAME, Default, $h_maingui)
    $h_debuglist = GUICtrlCreateList("", 1, 1, 634, 69, $WS_HSCROLL + $WS_VSCROLL + $LBS_NOINTEGRALHEIGHT + $LBS_NOSEL)

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

    GUISetState(@SW_SHOW, $h_maingui)
    GUISetState(@SW_SHOW, $h_debuggui)
    HotKeySet("+!d", "GUIDebugToggle")

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _GUIAnimate(Const $V_GUI, Const $N_MODE, Const $I_DURATION = 1000)
    If @OSVersion <> "WIN_VISTA" And @OSVersion <> "WIN_2003" And @OSVersion <> "WIN_XP" And @OSVersion <> "WIN_2000" Then Return (SetError(2, 0, 0))
    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", WinGetHandle($V_GUI), "int", $I_DURATION, "long", $N_MODE)
    Local Const $AI_GLE = DllCall("kernel32.dll", "int", "GetLastError")
    If $AI_GLE[0] Then Return (SetError(1, 0, 0))
    Return (1)
    EndFunc ;==>_GUIAnimate

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

    Func GUIDebugToggle()
    If BitAND(WinGetState("DebugWindow"), 2) Then
    _GUIAnimate ($h_debuggui, $AW_SLIDE_OUT_TOP)
    Else
    _GUIAnimate ($h_debuggui, $AW_SLIDE_IN_TOP)
    EndIf
    EndFunc ;==>GUIDebugToggle

    [/autoit]


    Gibt es eine Lösung, das Ganze sauber hinzubekommen?