- Offizieller Beitrag
Ich habe ein Problem beim erstellen von Buttons auf einer GUI, die in der Größe veränderbar sein soll.
Erstelle ich die Button gleich beim GUI erstellen und resize dann die GUI, funktioniert alles wie es sein soll. Problematisch wird es, wenn ich die Button lösche und danach neu erstellen will (ist im Programm erforderlich).
Sie sollen nach dem neu erstellen, wieder die gleiche Position einnehmen, wie vorher. Also auch beim resizen der GUI wieder mit verschoben werden. Und genau das bekomme ich nicht hin, bzw. nur mit einem Workaround (ich verkleinere die GUI auf die "normale" Größe lösche die Buttons, erstelle sie neu und vergrößere die GUI dann wieder auf die alte Größe). Dieser Workaround hat aber den Nachteil, dass man das verkleinern/vergrößern der GUI natürlich sieht und das stört mich.
Hier ist mal ein Testscript, mit dem ihr das Verhalten ausprobieren könnt.
Wenn ihr das Testscript startet und die GUI vergrößert, werden die Button korrekt verschoben (wie es sein soll). Klickt ihr dann aber auf den linken Button "Button neu erstellen 1", werden die Button falsch gesetzt (logisch, weil die Koordinaten nicht mehr stimmen).
Aber auch, wenn ich die Koordinaten abhängig von der Größe der GUI erstellen würde, würden sie beim anschließenden Resizing falsch verschoben werden.
Mein Workaround (siehe oben) habe ich mit dem Button "Button neu erstellen 2" nachgebaut. So passt wieder alles, aber das flackern der GUI beim verkleinern/vergrößern stört halt.
Gibt es da eine bessere Methode, wie man das hinbekommen kann?
#include <GUIConstantsEx.au3>
#include <Math.au3>
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
Global $aidButton[2][3]
Global $hGui = GUICreate('Test', 400, 300, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, '_GuiClose')
GUICtrlCreateLabel('', 199, 0, 2, 600, Default, $WS_EX_STATICEDGE)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH)
_CreateButton1()
GUICtrlCreateButton('Button neu erstellen 1', 10, 220, 160, 35)
GUICtrlSetOnEvent(-1, '_CreateButton1')
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKSIZE)
GUICtrlCreateButton('Button neu erstellen 2', 210, 220, 160, 35)
GUICtrlSetOnEvent(-1, '_CreateButton2')
GUICtrlSetResizing(-1, $GUI_DOCKHCENTER + $GUI_DOCKSIZE)
GUISetState(@SW_SHOW, $hGui)
Global $aWinSize = WinGetPos($hGui)
GUIRegisterMsg($WM_GETMINMAXINFO, '_WM_GETMINMAXINFO')
WinWaitClose($hGui)
Exit
Func _CreateButton1()
For $i = 0 To UBound($aidButton, 2) - 1
For $j = 0 To 1
GUICtrlDelete($aidButton[$j][$i])
Next
Next
For $i = 0 To UBound($aidButton, 2) - 1
$aidButton[0][$i] = GUICtrlCreateButton(Chr(65 + $i), 20 + $i * 50, 25, 45, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
$aidButton[1][$i] = GUICtrlCreateButton(Chr(65 + $i), 220 + $i * 50, 25, 45, 25)
GUICtrlSetResizing(-1, $GUI_DOCKHCENTER + $GUI_DOCKTOP + $GUI_DOCKSIZE)
Next
EndFunc ;==>_CreateButton1
Func _CreateButton2()
Local $aOldSize = WinGetPos($hGui)
WinMove($hGui, '', Default, Default, $aWinSize[2], $aWinSize[3])
For $i = 0 To UBound($aidButton, 2) - 1
For $j = 0 To 1
GUICtrlDelete($aidButton[$j][$i])
Next
Next
For $i = 0 To UBound($aidButton, 2) - 1
$aidButton[0][$i] = GUICtrlCreateButton(Chr(65 + $i), 20 + $i * 50, 25, 45, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
$aidButton[1][$i] = GUICtrlCreateButton(Chr(65 + $i), 220 + $i * 50, 25, 45, 25)
GUICtrlSetResizing(-1, $GUI_DOCKHCENTER + $GUI_DOCKTOP + $GUI_DOCKSIZE)
Next
WinMove($hGui, '', Default, Default, $aOldSize[2], $aOldSize[3])
EndFunc ;==>_CreateButton2
Func _GuiClose()
GUIDelete($hGui)
EndFunc ;==>_GuiClose
Func _WM_GETMINMAXINFO($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $iMsg, $iwParam
Local $minmaxinfo
If $hWnd = $hGui Then
$minmaxinfo = DllStructCreate('int;int;int;int;int;int;int;int;int;int', $ilParam)
DllStructSetData($minmaxinfo, 7, $aWinSize[2])
DllStructSetData($minmaxinfo, 8, $aWinSize[3])
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_GETMINMAXINFO
Alles anzeigen