GUI-Fenstergröße maximal / minimal

  • Hallo AutoIt-Freunde,

    wie kann man eine GUI mit $WS_SIZEBOX erstellen bei der man Höhe / Breite nicht kleiner/größer als xx ziehen kann?

    hab das hier schon gefunden:

    [autoit]

    #include <GUIConstants.au3>
    $AForm1 = GUICreate("AForm1", 633, 453, 193, 125, $WS_SIZEBOX)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_RESIZED
    $fenster = WinGetPos($AForm1, "") ;gibt [0]x-pos,[1]y-pos,[2]breite und [3]höhe zurück
    If $fenster[2] < 200 Then ;wenn breite < 200
    WinMove($AForm1, "", $fenster[0], $fenster[1], 200, $fenster[3]) ;position + höhe bleibt, breite auf 200
    ElseIf $fenster[3] < 200 Then ;wenn höhe < 200
    WinMove($AForm1, "", $fenster[0], $fenster[1], $fenster[2], 200) ;position + breite bleibt, höhe auf 200
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    jedoch "springt die größe in dem fall einfach wieder in die max. größe zurück.

    gibt es hier nicht eine lösung bei der die GUI erst gar nicht über eine bestimmte größe gezogen werden kann?

    Vielen Dank schon mal vorab!

    MFG Inferior

    Einmal editiert, zuletzt von Inferior (14. März 2013 um 10:41)

  • Klar kann man das :)
    Aber die Funktion die in GUIRegisterMsg übergeben wurde, wird zuerst (bei WM_SIZING) aufgerufen.
    Das bedeutet: Das Fenster wird nicht erst vergrößert bzw. verkleinert.
    So kann man das ganze einfach verhindern das überhaupt was verändert wird.

    2 Mal editiert, zuletzt von Yjuq (12. März 2013 um 16:10)

  • Hier hab ich was:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)
    Opt('GUICloseOnESC', 0)

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

    Global Enum $iMin, $iMax
    Global $ai_Width[2], $ai_Height[2]
    Global $hGUI

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

    $ai_Width[$iMin] = 200
    $ai_Width[$iMax] = 800

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

    $ai_Height[$iMin] = 150
    $ai_Height[$iMax] = 600

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

    $hGUI = GUICreate('Example - MG', 400, 300, -1, -1, $WS_CAPTION + $WS_SIZEBOX + $WS_SYSMENU)
    GUIRegisterMsg($WM_SIZING, 'WM_SIZING')
    GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI_EVENT_CLOSE')
    GUISetState()

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

    While Sleep(1000)
    WEnd

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

    Func WM_SIZING($hWnd, $Msg, $wParam, $lParam)
    Local Enum $iLeft = 1, $iTop, $iRight, $iBottom, $iWidth, $iHeight
    Local Enum $WMSZ_LEFT = 1, $WMSZ_RIGHT, $WMSZ_TOP, $WMSZ_TOPLEFT, $WMSZ_TOPRIGHT, $WMSZ_BOTTOM, $WMSZ_BOTTOMLEFT, $WMSZ_BOTTOMRIGHT
    Local $ai_Pos[7]

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

    Local $tStruct = DllStructCreate($tagRECT, $lParam)

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

    $ai_Pos[$iLeft] = DllStructGetData($tStruct, $iLeft)
    $ai_Pos[$iTop] = DllStructGetData($tStruct, $iTop)
    $ai_Pos[$iRight] = DllStructGetData($tStruct, $iRight)
    $ai_Pos[$iBottom] = DllStructGetData($tStruct, $iBottom)
    $ai_Pos[$iWidth] = $ai_Pos[$iRight] - $ai_Pos[$iLeft]
    $ai_Pos[$iHeight] = $ai_Pos[$iBottom] - $ai_Pos[$iTop]

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

    $wParam = int($wParam)

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

    If $ai_Pos[$iWidth] < $ai_Width[$iMin] Then
    If $wParam = $WMSZ_LEFT Or _
    $wParam = $WMSZ_TOPLEFT Or _
    $wParam = $WMSZ_BOTTOMLEFT Then
    DllStructSetData($tStruct, $iLeft, $ai_Pos[$iRight] - $ai_Width[$iMin])
    Else
    DllStructSetData($tStruct, $iRight, $ai_Pos[$iLeft] + $ai_Width[$iMin])
    EndIf
    ElseIf $ai_Pos[$iWidth] > $ai_Width[$iMax] Then
    If $wParam = $WMSZ_LEFT Or _
    $wParam = $WMSZ_TOPLEFT Or _
    $wParam = $WMSZ_BOTTOMLEFT Then
    DllStructSetData($tStruct, $iLeft, $ai_Pos[$iRight] - $ai_Width[$iMax])
    Else
    DllStructSetData($tStruct, $iRight, $ai_Pos[$iLeft] + $ai_Width[$iMax])
    EndIf
    EndIf

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

    If $ai_Pos[$iHeight] < $ai_Height[$iMin] Then
    If $wParam = $WMSZ_TOP Or _
    $wParam = $WMSZ_TOPLEFT Or _
    $wParam = $WMSZ_TOPRIGHT Then
    DllStructSetData($tStruct, $iTop, $ai_Pos[$iBottom] - $ai_Height[$iMin])
    Else
    DllStructSetData($tStruct, $iBottom, $ai_Pos[$iTop] + $ai_Height[$iMin])
    EndIf
    ElseIf $ai_Pos[$iHeight] > $ai_Height[$iMax] Then
    If $wParam = $WMSZ_TOP Or _
    $wParam = $WMSZ_TOPLEFT Or _
    $wParam = $WMSZ_TOPRIGHT Then
    DllStructSetData($tStruct, $iTop, $ai_Pos[$iBottom] - $ai_Height[$iMax])
    Else
    DllStructSetData($tStruct, $iBottom, $ai_Pos[$iTop] + $ai_Height[$iMax])
    EndIf
    EndIf
    EndFunc

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

    Func GUI_EVENT_CLOSE()
    Exit
    EndFunc

    [/autoit]
    • Offizieller Beitrag
    [autoit]

    #Region - Timestamp
    ; 2013-03-12 19:53:13
    #EndRegion

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

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt('GUIOnEventMode', 1)
    Global $hGUI = GUICreate('Test', 640, 90, -1, 0, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX, $WS_SIZEBOX), $WS_EX_COMPOSITED)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

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

    GUISetState()
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")

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

    While True
    Sleep(100)
    WEnd

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

    Func _End()
    Exit
    EndFunc ;==>_End

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    If $hWnd = $hGUI Then
    Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, 200) ; min X
    DllStructSetData($minmaxinfo, 8, 90) ; min Y
    DllStructSetData($minmaxinfo, 9, 1024) ; max X
    DllStructSetData($minmaxinfo, 10, 180) ; max Y
    EndIf
    EndFunc ;==>MY_WM_GETMINMAXINFO

    [/autoit]


    ;)

  • Auch von mir ein herzliches dankeschön für eure Mühe!

    das von Raupi funktioniert sehr gut ;)