#Include <GuiEdit.au3>
#Include <GuiListBox.au3>
#Include <WindowsConstants.au3>
#Include <GuiConstantsEx.au3>
#Include <WinAPI.au3>
Global $hWnd, $hList, $hEdit, _
$_aEdit_Info[3] = [ 0, 0, 0 ], _ ;Line, Lines, DefProc
$_cbEditProc = DllCallbackRegister( '_EditProc', 'lresult', 'hwnd;uint;wparam;lparam' )
; ---
$hWnd = GUICreate( '', 450, 500 )
$hList = _GUICtrlListBox_Create( $hWnd, '', 5, 5, 80, 490, $LBS_NOINTEGRALHEIGHT )
_WinAPI_EnableWindow( $hList, 0 )
$hEdit = _GUICtrlEdit_Create( $hWnd, '', 85, 5, 360, 490, BitOr($ES_MULTILINE, $ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL) )
$_aEdit_Info[2] = _WinAPI_SetWindowLong( $hEdit, $GWL_WNDPROC, DllCallbackGetPtr( $_cbEditProc ) )
GUISetState()
Do
Until GUIGetMsg() = -3
_WinAPI_SetWindowLong( $hEdit, $GWL_WNDPROC, $_aEdit_Info[2] )
_WinAPI_DestroyWindow( $hEdit )
_WinAPI_DestroyWindow( $hList )
DllCallbackFree( $_cbEditProc )
; ===================================
Func _EditProc($hWnd, $iMsg, $wParam, $lParam)
Local $iRet = _WinAPI_CallWindowProc( $_aEdit_Info[2], $hWnd, $iMsg, $wParam, $lParam )
; ---
Switch $iMsg
Case $WM_VSCROLL, $WM_CHAR, $WM_MOUSEWHEEL
__UpdateList()
EndSwitch
Return $iRet
EndFunc
Func __UpdateList()
Local $iLine, $iLines, $fLess, $Idx
; ---
_GUICtrlListBox_BeginUpdate( $hList )
$iLine = _GUICtrlEdit_GetFirstVisibleLine( $hEdit )
$iLines = _GUICtrlEdit_GetLineCount( $hEdit )
If $iLines <> $_aEdit_Info[1] Then
$fLess = ( $_aEdit_Info[1] > $iLines )
For $Idx = $_aEdit_Info[1] To $iLines - 1 Step $fLess ? -1 : 1
If $fLess Then
_GUICtrlListBox_DeleteString( $hList, $Idx + 1 )
Else
_GUICtrlListBox_AddString( $hList, __ToRight( $Idx + 1 ) )
EndIf
Next
EndIf
_GUICtrlListBox_EndUpdate( $hList )
If $iLine <> $_aEdit_Info[0] Then _
_GUICtrlListBox_SetTopIndex( $hList, $iLine )
; -
$_aEdit_Info[0] = $iLine
$_aEdit_Info[1] = $iLines
EndFunc
Func __ToRight( $sText, $iAlign = 12, $sCenter = ' ' )
Local $sRet, $aRes
; ---
$sRet = StringFormat( '%0' & $iAlign & 's', $sText )
$aRes = StringRegExp( $sRet, '^(0+)', 1 )
If Not @Error Then _
$sRet = StringRegExpReplace( $sRet, '^' & $aRes[0], StringReplace( $aRes[0], '0', $sCenter ) )
Return $sRet
EndFunc