Bug bei ControlMove und Group Controls?

  • Hallo liebe Community,
    ich habe ein kleines Problem mit einer GUI, an der ich gerade arbeite.

    Ich habe mehrere Group Controls mit Inhalten, die zur Laufzeit erstellt werden.
    Um das ganze übersichtlich zu halten, sollen die Group Controls samt Inhalt beim Hinzufügen oder entfernen eines neuen Controls verschoben werden.

    Dabei ist mir aufgefallen, das man z.B. einen Button nicht mehr drücken kann, nachdem das Group Control bewegt wurde.
    Anbei mal ein Beispiel, einfach auf OK klicken, um das Group Control zu verschieben.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $hGui = GUICreate("Gui", 655, 290, 291, 152, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_GROUP, $WS_HSCROLL, $WS_SIZEBOX))
    $Button1 = GUICtrlCreateButton("Ok", 443, 241, 97, 25, $WS_GROUP)
    GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    $Button2 = GUICtrlCreateButton("Abbrechen", 546, 241, 97, 25, $WS_GROUP)
    GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    $Group1 = GUICtrlCreateGroup("", 8, 8, 200, 100)
    $Button3 = GUICtrlCreateButton("Ersetzen", 58, 43, 100, 30)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    GUISetState()
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Button2
    Exit
    Case $Button1
    $pos = ControlGetPos($hGui, "", $Group1)
    ControlMove($hGui, "", $Group1, $pos[0], $pos[1]+50)
    EndSwitch
    WEnd

    [/autoit]

    Ist das ein Bug oder mache ich etwas falsch, wie könnte man das verhindern?

  • Moin!

    So wie du es jetzt machst, wird Group und Button quasi "verdoppelt".
    Laut deiner Beschreibung willst du aber beide verschieben und dann mußt du ControlMove auch auf beide anwenden.

    Falls ich richtig liege, würde es so funktionieren:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $hGui = GUICreate("Gui", 655, 290, 291, 152, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_GROUP, $WS_HSCROLL, $WS_SIZEBOX))
    $Button1 = GUICtrlCreateButton("Ok", 443, 241, 97, 25, $WS_GROUP)
    GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    $Button2 = GUICtrlCreateButton("Abbrechen", 546, 241, 97, 25, $WS_GROUP)
    GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    $Group1 = GUICtrlCreateGroup("", 8, 8, 200, 100)
    $Button3 = GUICtrlCreateButton("Ersetzen", 58, 43, 100, 30)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)

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

    GUISetState()
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Button2
    Exit
    Case $Button1
    $pos = ControlGetPos($hGui, "", $Group1)
    ControlMove($hGui, "", $Group1, $pos[0], $pos[1]+50)
    $pos = ControlGetPos($hGui, "", $Button3)
    ControlMove($hGui, "", $Button3, $pos[0], $pos[1]+50)
    GUICtrlSetState( $Button3, $GUI_ENABLE) ;==> ohne diesen Befehl, wird der Button nicht korrekt dargestellt (bis er geklickt wird)
    EndSwitch
    WEnd

    [/autoit]

    *edit*
    Das stimmt natürlich mit dem Anzeigebug, so wie misterspeed es unterhalb beschreibt. Verdoppelt wird da selbstverständlich nichts :wacko:
    Aber wie dem auch sei, mit meinen Änderungen gehts auf jeden Fall...

  • Ich würde sagen das einzige was du hier hast ist ein Anzeigebug, weil das Fenster nach dem Verschieben nicht neu gezeichnet wird. Klick zwei oder dreimal auf ok und schieb das Fenster dann kurz außerhalb des sichtbaren Desktopbereichst. Du wirst danach sehen, dass nur das Groupcontrol und nicht der Button verschoben wurde. Der Button ist nachwievor an seiner ursprünglichen Position und kann auch dort geklickt werden. Das Anzeigeproblem kannst du vermutlich mit der "redraw" Funktion (keine Lust nachzusehen wie sie genau heißt) in den WinAPI Funktionen in den Griff bekommen. Das eigentliche Problem, dass das Button Control nicht verschoben wird bekommst du wohl nur durch ein separates controlmove für alle betroffenen Controls gelöst. Die Hilfe spricht auch klar von einer visuellen Gruppierung, welche insbesondere bei Radio Buttons auch Auswirkungen auf die Klickbarkeit hat. Dass alle controls einer group aber zusammenhängen sollen wird dort nicht erwähnt und entspricht auch nicht meinen bisherigen Beobachtungen. Um das Verschieben einer ganzen Gruppe zu vereinfachen kann man aber die controlid des group Beginn und group Ende in einer Schleife verwenden.