Parece que lo he conseguido ....

( afalta de afinar un poco mas )
No subo los cambios al repositorio para probarlo bien antes, pero dejo aqui todo el c贸digo y espero vuestro feedback ...
1.- he creado una clase derivada de scrollbar ( colocada al final del archivo ereport.prg ) ....
#define SB_HORZ 聽 聽 聽 聽 0
#define SB_VERT 聽 聽 聽 聽 1
#define SB_CTL 聽 聽 聽 聽 聽2
CLASS ER_ScrollBar FROM 聽TScrollBar
聽 聽DATA 聽 nPrevPos
聽 聽METHOD SetPos( nPos ) INLINE ;
聽 聽 聽 聽 聽 聽 聽 聽 聽::nPrevPos:= ::GetPos() ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽SetScrollPos( if( ::lIsChild, ::oWnd:hWnd, ::hWnd ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽If( ::lIsChild, If( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽nPos, ::lReDraw )
ENDCLASS
2.- cambio en ER_MouseWheel ..
function ER_MouseWheel( nKey, nDelta, nXPos, nYPos )
聽 聽local aPoint := { nYPos, nXPos }
聽 聽ScreenToClient( oEr:oMainWnd:oWndClient:hWnd, aPoint )
聽 聽lScrollVert 聽:= .T.
聽 聽if IsOverWnd( oEr:oMainWnd:oWndClient:hWnd, aPoint[ 1 ], aPoint[ 2 ] )
聽
聽 聽 聽 if lAnd( nKey, MK_MBUTTON )
聽 聽 聽 聽 聽if nDelta > 0
聽 聽 聽 聽 聽 聽 ScrollV(-4, .t.)
聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 ScrollV(4,,.t.)
聽 聽 聽 聽 聽endif
聽 聽 聽 else
聽 聽 聽 聽 聽if nDelta > 0
聽 聽 聽 聽 聽 聽 ScrollV( - WheelScroll() , .T.,, .T. )
聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 ScrollV( WheelScroll() ,,.T.,.T. )
聽 聽 聽 聽 聽endif
聽 聽 聽 endif
聽 聽endif
return .T.
3.- cambio en SetScrollBar()
聽function SetScrollBar()
聽 聽//local oVScroll
聽 聽local nPageZugabe //:= 392/100
聽 聽local oWnd 聽 聽 聽 聽:= oEr:oMainWnd:oWndClient
聽 聽if !Empty( oWnd:oVScroll )
聽
聽 聽 聽 oWnd:oVScroll := ER_ScrollBar():WinNew(0,100,10,.T., oWnd )
聽 聽 聽 oWnd:oVScroll:bGoUp 聽 聽 = { || 聽ScrollV(-1 ) 聽}
聽 聽 聽 oWnd:oVScroll:bGoDown 聽 = { || ScrollV(1) }
聽 聽 聽 oWnd:oVScroll:bPageUp 聽 = { || 聽ScrollV(-4) 聽}
聽 聽 聽 oWnd:oVScroll:bPageDown = { || ScrollV(4 ) }
聽 聽 聽 oWnd:oVScroll:bPos 聽 聽 聽= { | nWert | ScrollV(nWert ) 聽}
聽 聽 聽 oWnd:oVScroll:nPgStep 聽 = 10
聽 聽 聽 oWnd:oVScroll:SetPos( 0 )
聽ENDIF
聽 聽if ! Empty( oWnd:oHScroll )
聽 聽 聽 nPageZugabe := 602/100
聽 聽 聽 oWnd:oHScroll:SetRange( 0, nTotalWidth / 100 )
聽 聽 聽 oWnd:oHScroll:bGoUp 聽 聽 = {|| ScrollHorizont( .T. ) }
聽 聽 聽 oWnd:oHScroll:bGoDown 聽 = {|| ScrollHorizont( , .T. ) }
聽 聽 聽 oWnd:oHScroll:bPageUp 聽 = {|| ScrollHorizont( ,, .T. ) }
聽 聽 聽 oWnd:oHScroll:bPageDown = {|| ScrollHorizont( ,,, .T. ) }
聽 聽 聽 oWnd:oHScroll:bPos 聽 聽 聽= {| nWert | ScrollHorizont( ,,,, .T., nWert/100 ) }
聽 聽 聽 oWnd:oHScroll:nPgStep 聽 = nPageZugabe 聽//602
聽 聽 聽 oWnd:oHScroll:SetPos( 0 )
聽 聽endif
return .T.
4.- a帽adida funcion ScrollV() que sustituye a scrollVertical() ( de momento comentada )
function ScrollV( nPosZugabe, lUp, lDown, lPos )
聽 聽local i, aFirstWndCoors, nAltWert
聽 聽 local nZugabe 聽 聽 := 14
聽 聽local nPageZugabe := 392
聽 聽local aCliRect 聽 聽:= oEr:oMainWnd:GetCliRect()
聽 聽local lReticule
聽 聽LOCAL oVScroll := oEr:oMainWnd:oWndClient:oVScroll
聽 聽DEFAULT lUp 聽 聽 聽 := .F.
聽 聽DEFAULT lDown 聽 聽 := .F.
聽 聽DEFAULT lPos 聽 聽 聽:= .F.
聽 聽UnSelectAll()
聽 聽 for i := 1 to 100
聽 聽 聽 if aWnd[ i ] <> nil
聽 聽 聽 聽 聽aFirstWndCoors := GetCoors( aWnd[ i ]:hWnd )
聽 聽 聽 聽 聽EXIT
聽 聽 聽 endif
聽 聽next
聽 聽if lUp
聽 聽 聽 if aFirstWndCoors[ 1 ] = 0
聽 聽 聽 聽 聽nZugabe := 0
聽 聽 聽 elseif aFirstWndCoors[ 1 ] + IIF( lUp, nZugabe, nPageZugabe ) >= 0
聽 聽 聽 聽 聽nZugabe 聽 聽 := -1 * aFirstWndCoors[ 1 ]
聽 聽 聽 聽 聽nPageZugabe := -1 * aFirstWndCoors[ 1 ]
聽 聽 聽 endif
聽 聽endif
聽 聽if lDown
聽 聽 聽 if aFirstWndCoors[ 1 ] + (nTotalHeight) <= aCliRect[3] - 80
聽 聽 聽 聽 聽nZugabe 聽 聽 := 0
聽 聽 聽 聽 聽nPageZugabe := 0
聽 聽 聽 endif
聽 聽endif
聽 聽lReticule = oGenVar:lShowReticule
聽 聽oGenVar:lShowReticule = .F.
聽 聽SetReticule( 0, 0 ) // turn off the rulers lines
聽 聽nAltWert := IF ( lPos, oVScroll:GetPos(), oVScroll:nPrevPos )
聽 聽oVScroll:SetPos( nPosZugabe )
聽 聽nZugabe := nTotalHeight * ( oVScroll:GetPos() - nAltWert ) / ( (nTotalHeight) / 100 )
聽 聽for i := 1 to 100
聽 聽 聽 if aWnd[ i ] <> nil
聽 聽 聽 聽 聽aWnd[ i ]:Move( aWnd[ i ]:nTop - Int(nZugabe/10), aWnd[ i ]:nLeft, 0, 0, .T. )
聽 聽 聽 endif
聽 聽next
聽 聽oGenVar:lShowReticule = lReticule
return .T.