• Offizieller Beitrag

    Hi,
    hier mal eine Lösung um Fenster aneinander zu docken. Nähere Erläuterungen im Skript.

    Spoiler anzeigen
    [autoit]

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

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

    $gui1 = GUICreate("Nummer 1", 300, 300)
    GUICtrlCreateGroup('Dockposition', 40, 40, 220, 220)
    $r1 = GUICtrlCreateRadio('1', 240, 140, 15, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $r2 = GUICtrlCreateRadio('2', 140, 240, 15, 17)
    $r3 = GUICtrlCreateRadio('3', 45, 140, 15, 17)
    $r4 = GUICtrlCreateRadio('4', 140, 50, 15, 17)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $gui2 = GUICreate("Ich bin gedockt", 200, 200)

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

    Global $aDocks[2][4] = [[$gui1,$gui2,1,-1],[$gui2,$gui1,3,-1]]
    ; ['GUI-master','GUI-slave',dockPos,Abstand]
    ; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
    ; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern
    ;=======================================================================================================
    ; Damit zwei Fenster wechselseitig reagieren, müssen beide im Array aufgeführt werden, einmal als Master
    ; und einmal als Slave.
    ; Dabei müssen die entgegengesetzten Flags für die Dockposition vergeben werden (1 u. 3 bzw. 2 u. 4)
    ;=======================================================================================================

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

    GUISetState(@SW_SHOW, $gui2)
    GUISetState(@SW_SHOW, $gui1)

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

    ; WM_MOVE registrieren:
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")

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

    ; Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
    _moved()

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    Case $r1
    $aDocks[0][2] = 1
    $aDocks[1][2] = 3
    _moved()
    Case $r2
    $aDocks[0][2] = 2
    $aDocks[1][2] = 4
    _moved()
    Case $r3
    $aDocks[0][2] = 3
    $aDocks[1][2] = 1
    _moved()
    Case $r4
    $aDocks[0][2] = 4
    $aDocks[1][2] = 2
    _moved()
    EndSwitch
    WEnd

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

    Func _moved()
    DllCall("User32.dll", "int", "PostMessageA", "hwnd", WinGetHandle($aDocks[0][0]), "int", $WM_MOVE, "int", 0, "int", 0)
    EndFunc

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

    Func WM_MOVE($hWndGUI)
    For $i = 0 To UBound($aDocks) -1
    If WinGetHandle($aDocks[$i][0]) = $hWndGUI Then
    Local $aPos1 = WinGetPos($aDocks[$i][0])
    Local $aPos2 = WinGetPos($aDocks[$i][1]), $iDiff = 0
    If $aDocks[$i][3] = -1 Then
    Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
    If IsArray($ret) Then $iDiff = $ret[0]
    Else
    $iDiff = $aDocks[$i][3]
    EndIf
    Switch $aDocks[$i][2]
    Case 1
    WinMove($aDocks[$i][1], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 2
    WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 3
    WinMove($aDocks[$i][1], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 4
    WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    EndIf
    Next
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Edit 26.05.2009
    Hier mal noch ein Beispiel zum Andocken eines Fensters an den Bildschirmrand.
    Einstellbar ist der Fangbereich, indem das Fenster "gecatcht" wird und der Abstand der Fensterränder zum Desktoprand.

    Spoiler anzeigen
    [autoit]

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

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

    Global $CatchWidth = 70 ; Pixelbereich indem das Fenster gefangen wird
    Global $BorderDiff = 2 ; Pixelabstand zum Rand

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

    Global $gui = GUICreate("Dock on Border", 300, 300)
    GUISetState(@SW_SHOW, $gui)

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

    ; WM_MOVE registrieren:
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func WM_MOVE($hWndGUI)
    If Not(WinGetHandle($gui) = $hWndGUI) Then Return $GUI_RUNDEFMSG
    Local $aPos = WinGetPos($gui)
    Local $Catch_Left = $CatchWidth, $Catch_Right = @DesktopWidth - $CatchWidth
    Local $Catch_Top = $CatchWidth, $Catch_Bottom = @DesktopHeight - $CatchWidth
    Select
    Case $aPos[0] <= $Catch_Left
    If $aPos[1] <= $Catch_Top Then
    WinMove($gui, '', $BorderDiff, $BorderDiff)
    ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
    WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
    Else
    WinMove($gui, '', $BorderDiff, $aPos[1])
    EndIf
    Case $aPos[0] + $aPos[2] >= $Catch_Right
    If $aPos[1] <= $Catch_Top Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
    ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
    Else
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $aPos[1])
    EndIf
    Case $aPos[1] <= $Catch_Top
    If $aPos[0] <= $Catch_Left Then
    WinMove($gui, '', $BorderDiff, $BorderDiff)
    ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
    Else
    WinMove($gui, '', $aPos[0], $BorderDiff)
    EndIf
    Case $aPos[1] + $aPos[3] >= $Catch_Bottom
    If $aPos[0] <= $Catch_Left Then
    WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
    ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
    Else
    WinMove($gui, '', $aPos[0], @DesktopHeight - $BorderDiff - $aPos[3])
    EndIf
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_MOVE

    [/autoit]

    Edit 14.10.2010
    Und hier mal noch ein Bsp. um mehrere Childs an eine Main-GUI zu kletten.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    $gui1 = GUICreate("Nummer 1", 300, 300)
    $gui2 = GUICreate("Ich bin gedockt RECHTS", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)
    $gui3 = GUICreate("Ich bin gedockt LINKS", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)
    $gui4 = GUICreate("Ich bin gedockt UNTEN", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)

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

    Global $aDocks[5][2] = [[$gui1,0],[$gui2,1],[$gui3,3],[$gui4,2],[-1]]
    ; [n][GUI,DockPos] - letztes Arrayelement ([Ubound($aDocks)-1][0]) speichert den Abstand
    ; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
    ; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern

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

    GUISetState(@SW_SHOW, $gui4)
    GUISetState(@SW_SHOW, $gui3)
    GUISetState(@SW_SHOW, $gui2)
    GUISetState(@SW_SHOW, $gui1)

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

    ;== WM_MOVE registrieren:
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")

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

    ;== Fenster anordnen und Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
    _ArrangeGUI()
    _moved()

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func _ArrangeGUI($Index_Master=0)
    Local $iDiff, $aPos1, $aPos2
    If $aDocks[UBound($aDocks)-1][0] = -1 Then
    Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
    If IsArray($ret) Then $iDiff = $ret[0]
    Else
    $iDiff = $aDocks[UBound($aDocks)-1][0]
    EndIf
    If $Index_Master = 0 Then ; === Main-GUI bewegt
    $aPos1 = WinGetPos(WinGetHandle($aDocks[0][0]))
    For $i = 1 To UBound($aDocks) -2
    $aPos2 = WinGetPos(WinGetHandle($aDocks[$i][0]))
    Switch $aDocks[$i][1]
    Case 1
    WinMove($aDocks[$i][0], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 2
    WinMove($aDocks[$i][0], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 3
    WinMove($aDocks[$i][0], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 4
    WinMove($aDocks[$i][0], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    Next
    Else ; === Child bewegt ==> zuerst Main-GUI nachrücken
    $aPos1 = WinGetPos(WinGetHandle($aDocks[$Index_Master][0]))
    $aPos2 = WinGetPos(WinGetHandle($aDocks[0][0]))
    Switch $aDocks[$Index_Master][1] ; Positionsflag entgegengesetzt behandeln
    Case 3
    WinMove($aDocks[0][0], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 4
    WinMove($aDocks[0][0], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 1
    WinMove($aDocks[0][0], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 2
    WinMove($aDocks[0][0], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    _moved() ; === $WM_MOVE senden um andere Childs auszurichten
    EndIf
    EndFunc

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

    Func _moved()
    DllCall("User32.dll", "int", "PostMessageA", "hwnd", $aDocks[0][0], "int", $WM_MOVE, "int", 0, "int", 0)
    EndFunc

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

    Func WM_MOVE($hWndGUI)
    For $i = 0 To UBound($aDocks) -2
    If $hWndGUI = WinGetHandle($aDocks[$i][0]) Then Return _ArrangeGUI($i)
    Next
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • Jo, ist gut, aber ich habe noch einen kleinen Bug gefunden
    Wenn ich ein Anderes Fenster activiere was über dem "Ich bin Gedockt" Fenster ist und ich dann wieder das Haubfenster activiere wird das "Ich bin Gedockt" nicht wieder in den vordergund geholt!

    mfg. Jam00

    • Offizieller Beitrag

    Jo, ist gut, aber ich habe noch einen kleinen Bug gefunden
    Wenn ich ein Anderes Fenster activiere was über dem "Ich bin Gedockt" Fenster ist und ich dann wieder das Haubfenster activiere wird das "Ich bin Gedockt" nicht wieder in den vordergund geholt!

    It's not a bug - it's a feature. :D Nein, Scherz beiseite. Dieser Workaround bezieht sich rein auf das Docking. Die Fensterverwaltung kannst du natürlich nach eigenem Gusto einbringen.

    Ich hab hier mal ein Bsp., wie das gelöst werden kann:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Winapi.au3>
    $gui1 = GUICreate("Nummer 1", 300, 300)
    GUICtrlCreateGroup('Dockposition', 40, 40, 220, 220)
    $r1 = GUICtrlCreateRadio('1', 240, 140, 15, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $r2 = GUICtrlCreateRadio('2', 140, 240, 15, 17)
    $r3 = GUICtrlCreateRadio('3', 45, 140, 15, 17)
    $r4 = GUICtrlCreateRadio('4', 140, 50, 15, 17)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $gui2 = GUICreate("Ich bin gedockt", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)

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

    Global $aDocks[2][4] = [[$gui1,$gui2,1,-1],[$gui2,$gui1,3,-1]]
    ; ['GUI-master','GUI-slave',dockPos,Abstand]
    ; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
    ; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern
    ;=======================================================================================================
    ; Damit zwei Fenster wechselseitig reagieren, müssen beide im Array aufgeführt werden, einmal als Master
    ; und einmal als Slave.
    ; Dabei müssen die entgegengesetzten Flags für die Dockposition vergeben werden (1 u. 3 bzw. 2 u. 4)
    ;=======================================================================================================

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

    GUISetState(@SW_SHOW, $gui2)
    GUISetState(@SW_SHOW, $gui1)

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

    ; WM_MOVE registrieren:
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")
    GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")

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

    ; Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
    _moved()

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    Case $r1
    $aDocks[0][2] = 1
    $aDocks[1][2] = 3
    _moved()
    Case $r2
    $aDocks[0][2] = 2
    $aDocks[1][2] = 4
    _moved()
    Case $r3
    $aDocks[0][2] = 3
    $aDocks[1][2] = 1
    _moved()
    Case $r4
    $aDocks[0][2] = 4
    $aDocks[1][2] = 2
    _moved()
    EndSwitch
    WEnd

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

    Func _moved()
    DllCall("User32.dll", "int", "PostMessageA", "hwnd", WinGetHandle($aDocks[0][0]), "int", $WM_MOVE, "int", 0, "int", 0)
    EndFunc

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

    Func WM_MOVE($hWndGUI)
    For $i = 0 To UBound($aDocks) -1
    If WinGetHandle($aDocks[$i][0]) = $hWndGUI Then
    Local $aPos1 = WinGetPos($aDocks[$i][0])
    Local $aPos2 = WinGetPos($aDocks[$i][1]), $iDiff = 0
    If $aDocks[$i][3] = -1 Then
    Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
    If IsArray($ret) Then $iDiff = $ret[0]
    Else
    $iDiff = $aDocks[$i][3]
    EndIf
    Switch $aDocks[$i][2]
    Case 1
    WinMove($aDocks[$i][1], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 2
    WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 3
    WinMove($aDocks[$i][1], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 4
    WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    EndIf
    Next
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func WM_ACTIVATE($hWndGUI)
    If WinGetHandle($aDocks[0][0]) = $hWndGUI Then _
    DllCall("User32.dll", "hwnd", "SetFocus", "hwnd", WinGetHandle($aDocks[0][1]))
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • Das kommt mir irgendwie bekannt vor... :D

    Super Arbeit! Ich werde es auf jedem Fall gut gebrauchen können ;)

  • Hallo BugFix.

    Coole Idee.

    Wenn Ich dann die "gedoggten" GUI's bewege, dann rattelt meine Festplatte odr was es immer ist im Gehäuse. Aber nur im Tower, nicht im Laptop.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo BugFix,

    habe Dein Script in meinem Programm umgesetzt und es funktioniert tadellos :P
    da ich absoluter Neuling bin in AutoIt steht ich jetzt noch vor dem Problem, dass ich die angedockten Fenster als $WS_POPUP darstellen möchte,
    im Moment haben sie die Titelleiste oben.
    Kannst Du mir bitte nochmal helfen ?!? ?(

    Gruß
    digitalworks

  • Hallo BugFix,

    hat sich erledigt, habe es hinbekommen :rofl:
    Nochmals vielen vielen Dank für Deine Unterstützung.

  • HI "theShadowAE",

    Du bist lustig, bin ja endlich froh, dass hin bekommen zu haben :)
    jetzt funktioniert alles, aber ich bin zu doof, die andockenden Guis nicht oben sondern versetzt anzudocken, habe schon jede menge werte verändert, aber es geht nicht ... bin wohl doch ein DAU ;(;(;(

    Hier mal das script...


    [spoiler]

    [autoit]


    Script Start - Add your code below here

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

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

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

    $gui1 = GUICreate("Nummer 1", 320, 480, -1, -1, $WS_POPUP)
    GUISetBkColor(0xB00000, $gui1)
    $btn1 = GUICtrlCreateButton (" 2. gui öffnen ", 15, 15, 80, 28)
    $btn2 = GUICtrlCreateButton (" 3. gui öffnen ", 15, 45, 80, 28)
    $btn3 = GUICtrlCreateButton (" 4. gui öffnen ", 15, 75, 80, 28)
    $btn4 = GUICtrlCreateButton (" exit ", 15, 120, 80, 28)

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

    $gui2 = GUICreate("2. gui", 200, 200, -1, -1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    GUISetBkColor(0x1DF424, $gui2)
    $btn2c = GUICtrlCreateButton ("close ", 15, 15, 80, 28)
    $gui3 = GUICreate("3. gui", 200, 200, -1, -1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    GUISetBkColor(0x000000 ,$gui3)
    $btn3c = GUICtrlCreateButton ("close ", 15, 15, 80, 28)
    $gui4 = GUICreate("4. gui", 200, 200, -1, -1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    GUISetBkColor(0x00000FF, $gui4)
    $btn4c = GUICtrlCreateButton ("close ", 15, 15, 80, 28)

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

    Global $aDocks[5][2] = [[$gui1,0],[$gui2,1],[$gui3,3],[$gui4,2],[0]]
    ; [n][GUI,DockPos] - letztes Arrayelement ([Ubound($aDocks)-1][0]) speichert den Abstand
    ; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
    ; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern

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

    GUISetState(@SW_HIDE, $gui4)
    GUISetState(@SW_HIDE, $gui3)
    GUISetState(@SW_HIDE, $gui2)
    GUISetState(@SW_SHOW, $gui1)

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

    ;== WM_MOVE registrieren:
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")

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

    ;== Fenster anordnen und Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
    _ArrangeGUI()
    _moved()

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    Case $btn1
    GUISetState(@SW_SHOW, $gui2)
    Case $btn2
    GUISetState(@SW_SHOW, $gui3)
    Case $btn3
    GUISetState(@SW_SHOW, $gui4)
    Case $btn4
    Exit
    Case $btn2c
    GUISetState(@SW_HIDE, $gui2)
    Case $btn3c
    GUISetState(@SW_HIDE, $gui3)
    Case $btn4c
    GUISetState(@SW_HIDE, $gui4)

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

    EndSwitch
    WEnd

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

    Func _ArrangeGUI($Index_Master=0)
    Local $iDiff, $aPos1, $aPos2
    If $aDocks[UBound($aDocks)-1][0] = -1 Then
    Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
    If IsArray($ret) Then $iDiff = $ret[0]
    Else
    $iDiff = $aDocks[UBound($aDocks)-1][0]
    EndIf
    If $Index_Master = 0 Then ; === Main-GUI bewegt
    $aPos1 = WinGetPos(WinGetHandle($aDocks[0][0]))
    For $i = 1 To UBound($aDocks) -2
    $aPos2 = WinGetPos(WinGetHandle($aDocks[$i][0]))
    Switch $aDocks[$i][1]
    Case 1
    WinMove($aDocks[$i][0], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 2
    WinMove($aDocks[$i][0], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 3
    WinMove($aDocks[$i][0], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 4
    WinMove($aDocks[$i][0], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    Next
    Else ; === Child bewegt ==> zuerst Main-GUI nachrücken
    $aPos1 = WinGetPos(WinGetHandle($aDocks[$Index_Master][0]))
    $aPos2 = WinGetPos(WinGetHandle($aDocks[0][0]))
    Switch $aDocks[$Index_Master][1] ; Positionsflag entgegengesetzt behandeln
    Case 3
    WinMove($aDocks[0][0], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 4
    WinMove($aDocks[0][0], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 1
    WinMove($aDocks[0][0], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 2
    WinMove($aDocks[0][0], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    _moved() ; === $WM_MOVE senden um andere Childs auszurichten
    EndIf
    EndFunc

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

    Func _moved()
    DllCall("User32.dll", "int", "PostMessageA", "hwnd", $aDocks[0][0], "int", $WM_MOVE, "int", 0, "int", 0)
    EndFunc

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

    Func WM_MOVE($hWndGUI)
    For $i = 0 To UBound($aDocks) -2
    If $hWndGUI = WinGetHandle($aDocks[$i][0]) Then Return _ArrangeGUI($i)
    Next
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Hi

    Ich hab ein Problem. Und zwa hab ich es so das das 2te Fenster, wo dann an das Mainfenster Andockt. Erst ausklappt sobald ich auf ein Button gedrückt habe.
    Genauso hab ich ein button bei dem 2 fenster um es wieder einzuklappen.
    Das erste mal ausklappen sowie einklappen funktioniert. Doch nachdem ersten mal einklappen kann ich es nicht nochma ausklappen.
    Da passiert nichts mehr wenn ich auf den ausklappen Button drücke.

    Hier ist der "Case" Code vom Ausklappen Button:
    INFO: Ich habs mit "GUISetState(@SW_HIDE,$Formeo)" versucht und mit "GUIDelete($Formeo)"

    [autoit]


    Case $Button3
    GUICtrlSetState($Button3,$GUI_DISABLE)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $Formeo = GUICreate("test", 615, 438, 192, 124)
    GUISetBkColor(0x000000)
    $Button1eo = GUICtrlCreateButton("<--- ", 8, 400, 75, 25)
    $Label1 = GUICtrlCreateLabel("test", 8, 8, 135, 21)
    GUICtrlSetFont(-1, 9, 400, 0, "Arial Black")
    GUICtrlSetColor(-1, 0x800000)
    $Start = GUICtrlCreateButton("Start", 8, 32, 59, 25)
    $Button3eo = GUICtrlCreateButton("Stop", 80, 32, 59, 25)
    GUISetState(@SW_SHOW)

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

    Global $aDocks[2][4] = [[$Fenster,$Formeo,1,-1],[$Formeo,$Fenster,3,-1]]
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")

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

    _moved()

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    Case $Button1eo
    GUICtrlSetState($Button3,$GUI_ENABLE)
    GUISetState(@SW_HIDE,$Formeo)

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

    EndSwitch
    WEnd

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

    Func _moved()
    DllCall("User32.dll", "int", "PostMessageA", "hwnd", WinGetHandle($aDocks[0][0]), "int", $WM_MOVE, "int", 0, "int", 0)
    EndFunc

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

    Func WM_MOVE($hWndGUI)
    For $i = 0 To UBound($aDocks) -1
    If WinGetHandle($aDocks[$i][0]) = $hWndGUI Then
    Local $aPos1 = WinGetPos($aDocks[$i][0])
    Local $aPos2 = WinGetPos($aDocks[$i][1]), $iDiff = 0
    If $aDocks[$i][3] = -1 Then
    Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
    If IsArray($ret) Then $iDiff = $ret[0]
    Else
    $iDiff = $aDocks[$i][3]
    EndIf
    Switch $aDocks[$i][2]
    Case 1
    WinMove($aDocks[$i][1], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
    Case 2
    WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
    Case 3
    WinMove($aDocks[$i][1], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
    Case 4
    WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
    EndSwitch
    EndIf
    Next
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Steam: Lachesis580

    • Offizieller Beitrag

    Dein Problem besteht, weil du die While Wend Schleife Zeile 19-31 nicht mehr verläßt.
    Du sollteste auch die GUi mit GUiDelete löschen und nicht verstecken. Danach einfach ExitLoop einfügen.
    Damit kommst du wieder in deine Hauptschleife zurück.

    Edit: Ich sehe auch nirgends wo deine Hauptschleife endet, wahrscheinlich in einem Teil des Scriptes was du nicht gepostet hast.
    Merkwürdig ist nur, das im Codeblock Nach Case $Button3 die beiden Funtionen stehen. Wenn das in deinem Script auch so ist, dann verlege die mal nach außerhalb der Hauptschleife.