先のサンプルがあまりにも適当だったので少しだけマシな物を作りました。
#include "hsp3util.as"
#include "user32.as"
; ウィンドウスタイル
#define WS_CHILD $40000000
#define WS_VISIBLE $10000000
; スクロールバースタイル
#define SBS_HORZ $00000000 ;水平スクロールバー
#define SBS_VERT $00000001 ;垂直スクロールバー
; スクロールバー通知コード
#define SB_LINELEFT $00000000 ;左の矢印を押した
#define SB_LINEUP $00000000 ;上の矢印を押した
#define SB_LINERIGHT $00000001 ;右の矢印を押した
#define SB_LINEDOWN $00000001 ;下の矢印を押した
#define SB_PAGELEFT $00000002 ;つまみの左側を押した
#define SB_PAGEUP $00000002 ;つまみの上側を押した
#define SB_PAGERIGHT $00000003 ;つまみの右側を押した
#define SB_PAGEDOWN $00000003 ;つまみの下側を押した
#define SB_THUMBPOSITION $00000004 ;つまみを離した
#define SB_THUMBTRACK $00000005 ;つまみを押した(ドラッグ)
#define SB_ENDSCROLL $00000008 ;スクロール終了
; スクロールバー識別子
#define SB_CTL $00000002 ;作成したコントロールスクロールバー
; SCROLLINFO構造体 定数
#define SIF_ALL $00000017
#define SIF_DISABLENOSCROLL $00000008
#define SIF_PAGE $00000002
#define SIF_POS $00000004
#define SIF_RANGE $00000001
#define SIF_TRACKPOS $00000010
; sendmsg用送信メッセージ
#define SBM_GETPOS $000000E1
#define SBM_GETRANGE $000000E3
#define SBM_GETSCROLLINFO $000000EA
#define SBM_SETPOS $000000E0
#define SBM_SETRANGE $000000E2
#define SBM_SETRANGEREDRAW $000000E6
#define SBM_SETSCROLLINFO $000000E9
; スクロールバーメッセージ
#define WM_HSCROLL $00000114 ;水平スクロールメッセージ
#define WM_VSCROLL $00000115 ;垂直スクロールメッセージ
screen 0, 1280, 960, , , ,640, 480
gradf 0, 0, 1280, 960, 0, $ffffff, $ff9999
color 255
redraw 0
repeat 1280
line 0, 0, cnt, 960
loop
redraw 1
pos 0, 460
;scrollbar 640, 20 ;↓と同じ
winobj "SCROLLBAR", "", 0, WS_CHILD|WS_VISIBLE|SBS_HORZ, 620, 20 ;横スクロールバー
scb_hwnd=objinfo(stat, 2)
pos 620, 0
winobj "SCROLLBAR", "", 0, WS_CHILD|WS_VISIBLE|SBS_VERT, 20, 460 ;縦スクロールバー
scb_hwnd2=objinfo(stat, 2)
nPage=32
dim SCROLLINFO, 7 ;SCROLLINFO構造体
SCROLLINFO(0)=28 ;cbSize 構造体のサイズ
SCROLLINFO(1)=SIF_ALL ;fMask
SCROLLINFO(2)=0 ;nMin スクロール幅の最小値
SCROLLINFO(3)=ginfo(12) ;nMax スクロール幅の最大値
SCROLLINFO(4)=nPage ;nPage スクロールする値
SCROLLINFO(5)=0 ;nPos スクロール位置
SCROLLINFO(6)=0 ;nTrackPos つまみの位置
sendmsg scb_hwnd, SBM_SETSCROLLINFO, 1, varptr(SCROLLINFO) ; SetScrollInfoでも同じ処理
;SetScrollInfo scb_hwnd, SB_CTL, varptr(SCROLLINFO), 1
SCROLLINFO(3)=ginfo(13) ;nMax
SCROLLINFO(4)=nPage ;nPage
sendmsg scb_hwnd2, SBM_SETSCROLLINFO, 1, varptr(SCROLLINFO)
pos 620, 460
statictext "", 20, 20 ;右下の空白部分を埋めるだけのオブジェクト
oncmd gosub *SCB_ROLL, WM_HSCROLL
oncmd gosub *SCB_ROLL, WM_VSCROLL
stop
*SCB_ROLL
oncmd 0
ip=iparam ;メッセージID
wp=wparam ;通知コード
lp=lparam ;スクロールしているスクロールバーのハンドル
bar_pos=(wp>>16)&$ffff ;wparamの上位ワード(スクロール位置情報)
wp=wp&$ffff ;wparamの下位ワード(通知コード)
SCROLLINFO(1)=SIF_ALL
sendmsg lp, SBM_GETSCROLLINFO, 0, varptr(SCROLLINFO)
;GetScrollInfo scb_hwnd, SB_CTL, varptr(SCROLLINFO)
switch wp
case 0 ;SB_LINELEFT or SB_LINEUP
SCROLLINFO(5)-=1
swbreak
case 1 ;SB_LINERIGHT or SB_LINEDOWN
SCROLLINFO(5)+=1
swbreak
case 2 ;SB_PAGELEFT or SB_PAGEUP
SCROLLINFO(5)-=SCROLLINFO(4)
swbreak
case 3 ;SB_PAGERIGHT or SB_PAGEDOWN
SCROLLINFO(5)+=SCROLLINFO(4)
swbreak
case 5 ;SB_THUMBTRACK ;4(SB_THUMBPOSITION)にするとつまみを放した時だけスクロール処理を行う
SCROLLINFO(5)=bar_pos
swbreak
swend
SCROLLINFO(1)=SIF_POS ;SIF_ALL以外の場合、使う関数や送信メッセージが変わるので注意
SCROLLINFO(5)=limit(SCROLLINFO(5), SCROLLINFO(2), SCROLLINFO(3))
title "スクロールしている位置="+SCROLLINFO(5)+" メッセージID="+ip+" 通知コード="+wp+" スクロールバーのハンドル="+lp
;SetScrollInfoの代わりにsendmsgを使う場合、wparamかlparamは再描画フラグになる。
;sendmsg lp, SBM_SETSCROLLINFO, 1, varptr(SCROLLINFO) ;wparamが再描画フラグ
sendmsg lp, SBM_SETPOS, SCROLLINFO(5), 1 ;lparamが再描画フラグ
;SetScrollInfo scb_hwnd, SB_CTL, varptr(SCROLLINFO), 1
; スクロール位置の調整
if ip=WM_HSCROLL {
bar_x=limit(SCROLLINFO(5), 0, SCROLLINFO(3)-SCROLLINFO(4))
} else {
bar_y=limit(SCROLLINFO(5), 0, SCROLLINFO(3)-SCROLLINFO(4))
}
groll bar_x, bar_y
oncmd 1
return