Scrollbars

  • Es were super wenn mir hier jemand eine funktionierende scrolbar reinmachen könnte, so das man auch die untersten editboxen sehen kann als zu ihnen scrolen kann!!

    ich hab daran verzweifelt und weiß echt nitmer weiter!! Ich hoffe mir kann jemand helfen!!


    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiScrollBars.au3>
    #include <ScrollBarConstants.au3>

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

    Global $hEdit[1]

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

    $hGui = GUICreate("Gui", 300, 500)
    $hAdd = GUICtrlCreateButton("Hinzufügen", 30, 20, 100, 25)
    $hEdit[0] = GUICtrlCreateEdit("", 20, 60, 260, 100, BitOR($WS_VSCROLL, $ES_WANTRETURN))
    GUISetState()

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hAdd
    ReDim $hEdit[UBound($hEdit) + 1]
    $aPos = ControlGetPos($hGui, "", $hEdit[UBound($hEdit) - 2])
    $hEdit[UBound($hEdit) - 1] = GUICtrlCreateEdit("", 20, $aPos[1] + $aPos[3], 260, 100, BitOR($WS_VSCROLL, $ES_WANTRETURN))
    EndSwitch
    WEnd

    [/autoit]
  • So ähnlich geht´s. Musst nur noch die MaxScrollRange ab einer gewissen Anzahl von Edits hoch setzen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiScrollBars.au3>
    #include <ScrollBarConstants.au3>

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

    $struct = "DWORD vkCode;" _
    & "DWORD scanCode;" _
    & "long flags;" _
    & "ULONG_PTR dwExtraInfo"

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

    Global $hMouseHook, $WheelMoving, $hWinHook
    Global $hEdit[1]

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

    $hGui = GUICreate("Gui", 300, 500)
    $hAdd = GUICtrlCreateButton("Hinzufügen", 30, 20, 100, 25)
    $hEdit[0] = GUICtrlCreateEdit("", 20, 60, 260, 100, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL))
    GUISetState()

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

    GUISetState()

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

    $CallbackMouseProc = TogglePlugMouse()
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")

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

    _GUIScrollBars_Init($hGui)
    ;~ _GUIScrollBars_ShowScrollBar($hGui, $SB_VERT, $ESB_DISABLE_BOTH)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hAdd
    ReDim $hEdit[UBound($hEdit) + 1]
    $aPos = ControlGetPos($hGui, "", $hEdit[UBound($hEdit) - 2])
    $hEdit[UBound($hEdit) - 1] = GUICtrlCreateEdit("", 20, $aPos[1] + $aPos[3], 260, 100, BitOR($WS_VSCROLL, $ES_WANTRETURN))
    EndSwitch
    WEnd

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

    Func WM_VSCROLL($hWnd, $msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $pos, $TrackPos

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

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $yChar = $aSB_WindowInfo[$index][3]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

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

    ; Ermittelt alle Informationen der vertikalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die y-Position für einen späteren Vergleich
    $pos = $yPos

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

    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Min)

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

    Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Max)

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

    Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $pos - 1)

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

    Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $pos + 1)

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

    Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $pos - $Page)

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

    Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $pos + $Page)

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

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

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

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

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

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ; // Falls sich die y-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    $pos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $pos))
    $yPos = $pos
    EndIf

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

    Return $GUI_RUNDEFMSG

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

    EndFunc ;==>WM_VSCROLL

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

    Func _GetWheelMove()
    Local $x = StringLeft($WheelMoving, 1)
    $WheelMoving = StringTrimLeft($WheelMoving, 1)
    Return $x
    EndFunc ;==>_GetWheelMove

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

    Func TogglePlugMouse($hCallProc = 0)
    If IsArray($hMouseHook) Then
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hMouseHook[0])
    DllCallbackFree($hCallProc)
    Return 0
    EndIf

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

    Local Const $WH_MOUSE_LL = 14
    Local $hMouseProc = DllCallbackRegister("_MouseProc", "int", "int;ptr;ptr")
    Local $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
    $hMouseHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", _
    "int", $WH_MOUSE_LL, _
    "ptr", DllCallbackGetPtr($hMouseProc), _
    "hwnd", $hMod[0], _
    "dword", 0)
    Return $hMouseProc
    EndFunc ;==>TogglePlugMouse

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then
    Local $iRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hWinHook[0], _
    "int", $nCode, _
    "ptr", $wParam, _
    "ptr", $lParam)
    Return $iRet[0]
    EndIf
    $dllstruct = DllStructCreate($struct, $lParam)
    If $wParam = 0x20A Then
    If DllStructGetData($dllstruct, 3) > 0 Then
    If _GUIScrollBars_GetScrollInfoMin($hGui, $SB_VERT) < _GUIScrollBars_GetScrollInfoPos($hGui, $SB_VERT) Then
    _GUIScrollBars_SetScrollInfoPos($hGui, $SB_VERT, _GUIScrollBars_GetScrollInfoPos($hGui, $SB_VERT) - 5)
    EndIf
    ElseIf DllStructGetData($dllstruct, 3) < 0 Then
    If _GUIScrollBars_GetScrollInfoMax($hGui, $SB_VERT) > _GUIScrollBars_GetScrollInfoPos($hGui, $SB_VERT) Then
    _GUIScrollBars_SetScrollInfoPos($hGui, $SB_VERT, _GUIScrollBars_GetScrollInfoPos($hGui, $SB_VERT) + 5)
    EndIf
    EndIf
    EndIf
    Return 0
    EndFunc ;==>_MouseProc

    [/autoit]

    Gibt wahrscheinlich einfachere und bessere Wege, kenne aber keinen ;)