$SW_SIZEBOX Frage

  • Guten Morgen =)

    Also mit $SW_SIZEBOX machte ich ja die GUI größenveränderbar.

    Nun ich hätte es gerne das man nur die Höhe nicht die Breite ändern kann.

    Kann mir da jemand weiterhelfen?
    Ich habe in der Hilfe und in der Forumsuche nichts zu gefunden

    Mfg Aiden

    • Offizieller Beitrag

    Hi,

    hiermit kannst du die MIN und MAX Größe deiner GUI angeben.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Const $WM_GETMINMAXINFO = 0x24

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

    GUICreate("Test GUI", 500, 500, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, 500) ; min X
    DllStructSetData($minmaxinfo, 8, 250) ; min Y
    DllStructSetData($minmaxinfo, 9, 500) ; max X
    DllStructSetData($minmaxinfo, 10, 700) ; max Y
    Return 0
    EndFunc ;==>MY_WM_GETMINMAXINFO

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

    #cs
    typedef struct {
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
    } MINMAXINFO;
    #ce

    [/autoit]

    So long,

    Mega

  • Hallo!

    Ich habe da noch eine Frage zu:

    Ist es möglich nur eine bestimmte GUI zu begrenzen?

    Ich meine damit ich habe in meinem Script mehrere GUI-Fenster
    und das eine Soll begrenzt sein das andere nicht.

    MfG Aiden

    • Offizieller Beitrag

    Hi,

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Const $WM_GETMINMAXINFO = 0x24

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

    $main_GUI = GUICreate("Main GUI", 300, 100, 10, 10, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
    $b_1 = GUICtrlCreateButton("Click me 1", 10, 10, 80, 20)
    GUISetState(@SW_SHOW, $main_GUI)

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

    $child_GUI = GUICreate("Child GUI", 300, 100, 330, 10, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX), Default, $main_GUI)
    $b_2 = GUICtrlCreateButton("Click me 2", 10, 10, 80, 20)
    GUISetState(@SW_SHOW, $child_GUI)

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

    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")

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

    While 1
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $main_GUI
    MsgBox(16, "MAIN", "Closed MAIN", 2)
    Exit(0)
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $child_GUI
    MsgBox(16, "CHILD", "CLOSED CHILD", 2)
    GUIDelete($child_GUI)
    Case $msg[0] = $b_1 And $msg[1] = $main_GUI
    MsgBox(16, "MAIN", "Button 1", 2)
    Case $msg[0] = $b_2 And $msg[1] = $child_GUI
    MsgBox(16, "CHILD", "Button 2", 2)
    EndSelect
    WEnd

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    If $hWnd <> $main_GUI Then Return
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, 500) ; min X
    DllStructSetData($minmaxinfo, 8, 250) ; min Y
    DllStructSetData($minmaxinfo, 9, 500) ; max X
    DllStructSetData($minmaxinfo, 10, 700) ; max Y
    Return 0
    EndFunc ;==>MY_WM_GETMINMAXINFO

    [/autoit]

    So long,

    Mega

  • Hi,

    Probiere gerade das 1. Beispiel aus und stoße dabei auf folgendes Problem:

    [autoit]

    GUICreate("Test GUI", 500, 500, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))

    [/autoit]

    ...erschafft ein Fenster mit einer Breite von 508px (inkl. Rahmen). Das entspricht auch dem mit WinGetPos() ausgelesenen Wert.

    Nach Klicken auf den Rahmen schrumpft das Fenster auf 500px zusammen. Das ist auch die Breite, die WinGetClientSize() zurückgibt.

    autoit.de/wcf/attachment/2399/

    Dieses Beispiel...

    Spoiler anzeigen
    [autoit]

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

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

    $TestGUI = GUICreate("Test GUI", 500, 250, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))

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

    ;GUICtrlCreateMenu("Test")

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

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

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

    $WinPos = WinGetPos($TestGUI)
    $WinClientSize = WinGetClientSize($TestGUI)

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, 500 + $WinPos[2] - $WinClientSize[0]) ; min X
    DllStructSetData($minmaxinfo, 8, 250 + $WinPos[3] - $WinClientSize[1]) ; min Y
    DllStructSetData($minmaxinfo, 9, 500 + $WinPos[2] - $WinClientSize[0]) ; max X
    DllStructSetData($minmaxinfo, 10, 700 + $WinPos[3] - $WinClientSize[1]) ; max Y
    Return 0
    EndFunc ;==>MY_WM_GETMINMAXINFO

    [/autoit]


    ...funktioniert auf den ersten Blick. Fügt man der GUI jedoch ein Menu hinzu, wird dessen Höhe ignoriert :(

    Danke für jeden Vorschlag!

    Gruß, Hank7

  • Entweder Caption und Frame daten auslesen oder Die Menuhöhe auslesen und dann abziehen :)

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIMenu.au3>
    #include <WinAPI.au3>
    $TestGUI = GUICreate("Test GUI", 500, 250, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))

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

    GUICtrlCreateMenu("Test")

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

    GUISetState(@SW_SHOW)

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

    ; Möglichkeit 1:
    $FrameWidth = 2*_WinAPI_GetSystemMetrics(32) ; SM_CXSIZEFRAME
    $FrameHeight = _WinAPI_GetSystemMetrics(33) ; SM_CYSIZEFRAME
    $FrameHeight += _WinAPI_GetSystemMetrics(4) ; Caption Height

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

    ; Möglichkeit 2
    ;~ $WinSize = WinGetPos($TestGUI)
    ;~ $WinClientSize = WinGetClientSize($TestGUI)
    ;~ $FrameHeight = $WinSize[3]-$WinClientSize[1]
    ;~ $FrameWidth = $WinSize[2]-$WinClientSize[0]
    ;~ If Number(_GUICtrlMenu_GetMenu($TestGUI))>0) Then $FrameHeight -= _WinAPI_GetSystemMetrics(15)

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

    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, 500+$FrameWidth) ; min X
    DllStructSetData($minmaxinfo, 8, 250+$FrameHeight) ; min Y
    DllStructSetData($minmaxinfo, 9, 500+$FrameWidth) ; max X
    DllStructSetData($minmaxinfo, 10, 700+$FrameHeight) ; max Y
    Return 0
    EndFunc ;==>MY_WM_GETMINMAXINFO

    [/autoit]
  • Perfekt :thumbup:

    Sollte eine UDF sein ;)
    Edit: Ist ja schon in der Liste!

    Danke,
    Hank7

    Einmal editiert, zuletzt von Hank7 (9. Juni 2008 um 15:45)