need code like this:
MAP
MODULE('')
CallWindowProc(LONG,UNSIGNED,SIGNED,UNSIGNED,LONG),LONG,PASCAL,NAME('CallWindowProcA')
END
SubClassFunc1(UNSIGNED,UNSIGNED,UNSIGNED,LONG),LONG,PASCAL
MoveScrollBar()
END
ViewHeight LONG
ViewAllHeight LONG
SavedProc1 LONG
MouseY LONG
SAV:MouseY LONG
! timer need for update MOUSEY data :)
Window WINDOW('Caption'),AT(,,395,224),FONT('Segoe UI',8,,),TIMER(1),GRAY
IMAGE,AT(8,4,143,216),USE(?IMAGE1),VSCROLL
IMAGE,AT(174,4,149,215),USE(?IMAGE2),VSCROLL
BUTTON('Up'),AT(338,4,45,32),USE(?ButtonUp)
PROMPT('Use button or drag white space wo button in this image'),AT(334,62,61,36),USE(?Prompt1)
STRING('<<---------'),AT(332,102),USE(?String1)
BUTTON('Down'),AT(338,182,45,32),USE(?ButtonDown)
END
CODE
OPEN(Window)
! get view height
ViewHeight = ?IMAGE1{PROP:Height}
DO CreateControls
SavedProc1 = ?Image2{PROP:WndProc}
?Image2{PROP:WndProc} = ADDRESS(SubClassFunc1)
ACCEPT
CASE ACCEPTED()
OF ?ButtonDown
CurPos# = ?IMAGE2{PROP:VScrollPos}
NewPos# = CurPos# + (ViewHeight / (ViewAllHeight / 255))
?IMAGE2{PROP:VScrollPos} = CHOOSE(NewPos# <= 255 , NewPos#, 255)
OF ?ButtonUp
CurPos# = ?IMAGE2{PROP:VScrollPos}
NewPos# = CurPos# - (ViewHeight / (ViewAllHeight / 255))
?IMAGE2{PROP:VScrollPos} = CHOOSE(NewPos# > 0 , NewPos#, 0)
END
END
CreateControls ROUTINE
DATA
Y LONG(10)
NewFEQ Signed,AUTO
CODE
LOOP 20 TIMES
NewFEQ = CREATE(0,CREATE:Button) !, ?Image1)
NewFeq{PROP:Parent} = ?Image1
NewFEQ{PROP:Text} = 'Button ['& NewFeq &']'
SETPOSITION(NewFeq, 10, Y, 60, 10) ; Y += 20
NewFeq{PROP:Scroll} = TRUE
NewFEQ{PROP:Hide} = FALSE
END
! get last ypos + height
ViewAllHeight = NewFeq{PROP:Ypos} + NewFeq{PROP:Height}
Y = 10
LOOP 20 TIMES
NewFEQ = CREATE(0,CREATE:Button) !, ?Image2)
NewFeq{PROP:Parent} = ?Image2
NewFEQ{PROP:Text} = 'Button ['& NewFeq &']'
SETPOSITION(NewFeq, 10, Y, 60, 10) ; Y += 20
NewFeq{PROP:Scroll } = TRUE
NewFEQ{PROP:Hide}=FALSE
END
MoveScrollBar PROCEDURE
CODE
! down
IF SAV:MouseY < MouseY
CurPos# = ?IMAGE2{PROP:VScrollPos}
NewPos# = CurPos# + ((MouseY - SAV:MouseY) / (ViewAllHeight / 255))
?IMAGE2{PROP:VScrollPos} = CHOOSE(NewPos# <= 255 , NewPos#, 255)
! up
ELSE
CurPos# = ?IMAGE2{PROP:VScrollPos}
NewPos# = CurPos# - ((SAV:MouseY - MouseY) / (ViewAllHeight / 255))
?IMAGE2{PROP:VScrollPos} = CHOOSE(NewPos# > 0 , NewPos#, 0)
END
SubClassFunc1 PROCEDURE(hWnd,wMsg,wParam,lParam)
WM_MOUSEMOVE EQUATE(0200h)
WM_LBUTTONDOWN EQUATE(0201h)
WM_LBUTTONUP EQUATE(0202h)
CODE
CASE wMsg
OF WM_MOUSEMOVE
MouseY = MOUSEY()
OF WM_LBUTTONDOWN
SAV:MouseY = MouseY
OF WM_LBUTTONUP
MoveScrollBar
END
RETURN(CallWindowProc(SavedProc1,hWnd,wMsg,wParam,lParam))
There still need to catch clicks through the controls.