Up-/Down-Control bei Input

    • Offizieller Beitrag

    Mir ist gerade aufgefallen, dass das Up-/Down-Control wohl nur mit einem 16-Bit-signed-Int-Wert arbeitet.

    Beispiel:

    [autoit]


    #include <EditConstants.au3>
    Global $hGUI = GUICreate('Test', 120, 100, -1, -1)
    $hCounter = GUICtrlCreateInput('32767', 10, 10, 100, 22, BitOR($ES_NUMBER, $ES_RIGHT))
    GUICtrlCreateUpdown($hCounter)
    ;~ GUICtrlSetLimit(-1, 40000, 0)
    GUISetState()
    Do
    Until GUIGetMsg() = -3

    [/autoit]


    Hier kann man über die Up-/Down-Controls keinen Wert größer als 32767 einstellen. Mit dem auskommentierten SetLimit wird's völlig konfus, dann kommt es auf den eingestellten MAX-Wert an, was man einstellen kann, aber größer als 32767 geht's auch damit nicht.
    Kann man das Problem sonst irgendwie umgehen?

  • Könnt ihr mir wenigstens bestätigen, dass das bei euch auch so ist.


    Ist bei mir genauso, der einstellbare Bereich reicht von -32767 bis +32767 :(

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.

    • Offizieller Beitrag

    Als Workaround bleibt nur Eigenbau:

    [autoit]

    #include <EditConstants.au3>
    Global $hGUI = GUICreate('Test', 120, 100, -1, -1)
    $hCounter = GUICtrlCreateInput('32767', 10, 10, 90, 22, BitOR($ES_NUMBER, $ES_RIGHT))
    ;~ GUICtrlCreateUpdown($hCounter)
    $bUp = GUICtrlCreateButton('', 101, 10, 14, 11)
    $bDown = GUICtrlCreateButton('', 101, 21, 14, 11)
    ;~ GUICtrlSetLimit(-1, 40000, 0)
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    Case $bUp
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter)+1)
    Case $bDown
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter)-1)
    EndSwitch
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Danke, für's testen.
    Ich habe mir jetzt einen Workaround mit WM_NOTIFY gebastelt:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate('Test', 220, 100, -1, -1)

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

    $hInput = GUICtrlCreateInput('32767', 5, 50, 210, 22)
    $hUpDown = GUICtrlCreateUpdown($hInput)

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

    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, 'MY_WM_NOTIFY')

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

    Do
    Until GUIGetMsg() = -3

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

    Func MY_WM_NOTIFY($hWnd, $msg, $wParam, $lParam)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    Switch $nID
    Case $hUpDown
    Local $aContrPos = ControlGetPos($hGUI, '', $hUpDown)
    If Not IsArray($aContrPos) Then Return 1
    Local $aMousePos = GUIGetCursorInfo($hGUI)
    If Not IsArray($aMousePos) Then Return 1
    If $aMousePos[1] > $aContrPos[1] + $aContrPos[3]/2 Then
    GUICtrlSetData($hInput, GUICtrlRead($hInput) - 1)
    Else
    GUICtrlSetData($hInput, GUICtrlRead($hInput) + 1)
    EndIf
    Return 1
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Was haltet ihr davon?

  • Klasse, Oscar! :thumbup:

    Das ist so gut und einfach nachvollziehbar, das könnte man doch sehr gut als Workaround in die (deutsche) Hilfe einbauen.
    Was meinst du dazu?

    Gruß Ashpool

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.

    • Offizieller Beitrag

    Hi Oscar,
    ich war mal so frei und hab die MY_WM_NOTIFY-Funktion etwas geschrumpft ;)

    [autoit]

    Func MY_WM_NOTIFY($hWnd, $msg, $wParam)
    If Not BitAND($wParam, 0x0000FFFF) = $hUpDown Then Return 0
    Local $aContrPos = ControlGetPos($hGUI, '', $hUpDown)
    If Not IsArray($aContrPos) Then Return 1
    Local $aMousePos = GUIGetCursorInfo($hGUI)
    If Not IsArray($aMousePos) Then Return 1
    If $aMousePos[1] > $aContrPos[1] + $aContrPos[3]/2 Then
    Return GUICtrlSetData($hInput, GUICtrlRead($hInput) - 1)
    Else
    Return GUICtrlSetData($hInput, GUICtrlRead($hInput) + 1)
    EndIf
    EndFunc

    [/autoit]