So ähnlich geht´s. Musst nur noch die MaxScrollRange ab einer gewissen Anzahl von Edits hoch setzen.
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiScrollBars.au3>
#include <ScrollBarConstants.au3>
$struct = "DWORD vkCode;" _
& "DWORD scanCode;" _
& "long flags;" _
& "ULONG_PTR dwExtraInfo"
Global $hMouseHook, $WheelMoving, $hWinHook
Global $hEdit[1]
$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()
GUISetState()
[/autoit] [autoit][/autoit] [autoit]$CallbackMouseProc = TogglePlugMouse()
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
_GUIScrollBars_Init($hGui)
;~ _GUIScrollBars_ShowScrollBar($hGui, $SB_VERT, $ESB_DISABLE_BOTH)
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
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
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
; 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
; Auswertung der vom System gemeldeten Scroll-Nachricht
Switch $nScrollCode
Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
DllStructSetData($tSCROLLINFO, "nPos", $Min)
Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
DllStructSetData($tSCROLLINFO, "nPos", $Max)
Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $pos - 1)
Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $pos + 1)
Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
DllStructSetData($tSCROLLINFO, "nPos", $pos - $Page)
Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
DllStructSetData($tSCROLLINFO, "nPos", $pos + $Page)
Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
EndSwitch
;~ // 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.
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
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
Func TogglePlugMouse($hCallProc = 0)
If IsArray($hMouseHook) Then
DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hMouseHook[0])
DllCallbackFree($hCallProc)
Return 0
EndIf
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
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
Gibt wahrscheinlich einfachere und bessere Wege, kenne aber keinen ![]()