だいぶ長くなってしまいましたが、こんな感じでやってみました。
ユーザーがスクロール操作した際、実際のスクロール処理は
自分でやらなければならないあたりが面倒です。
また、画面に描いた文字や図形はgrollでスクロールできるのですが、
オブジェクトについてはSetWindowPos等を使って
自分で移動させなければいけないようです。
#include "user32.as"
#const SM_CXVSCROLL 2
#const SM_CYHSCROLL 3
#const WS_HSCROLL 0x100000
#const WS_VSCROLL 0x200000
#const SB_HORZ 0
#const SB_VERT 1
#const SB_BOTH 3
#const SIF_ALL 0x17
#const SIF_DISABLENOSCROLL 0x8
#const SWP_NOSIZE 0x1
#const SWP_NOMOVE 0x2
#const SWP_NOZORDER 0x4
#const SWP_FRAMECHANGED 0x20
#const WM_HSCROLL 0x114
#const WM_VSCROLL 0x115
#const scr_wid 800 //スクリーン全体の(表示されていない部分も含めた)横幅
#const scr_hei 600 //スクリーン全体の(表示されていない部分も含めた)縦幅
#const win_wid0 640 //ウィンドウの横幅
#const win_hei0 480 //ウィンドウの縦幅
#const roll_arr 16 //スクロールバーの矢印を押した時の移動量
#const roll_spc 64 //スクロールバーの空白部分を押した時の移動量
GetSystemMetrics SM_CXVSCROLL //縦スクロールバーの横幅を求める
w_adj=stat
GetSystemMetrics SM_CYHSCROLL //横スクロールバーの縦幅を求める
h_adj=stat
screen 0,scr_wid,scr_hei,0,,,win_wid0,win_hei0
//スクロールバーを有効に
GetWindowLong hwnd,-16
SetWindowLong hwnd,-16,stat|WS_HSCROLL|WS_VSCROLL
win_wid=win_wid0-w_adj
win_hei=win_hei0-h_adj
dim scrinfo_h,7
//横スクロールバーの設定
scrinfo_h=7*4,SIF_ALL|SIF_DISABLENOSCROLL,0,scr_wid,win_wid,0,0
SetScrollInfo hwnd,SB_HORZ,varptr(scrinfo_h),1
//縦スクロールバーの設定
dim scrinfo_v,7
scrinfo_v=7*4,SIF_ALL|SIF_DISABLENOSCROLL,0,scr_hei,win_hei,0,0
SetScrollInfo hwnd,SB_VERT,varptr(scrinfo_v),1
//スクロールバーを表示
SetWindowPos hwnd,0,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED
oncmd gosub *h_scr,WM_HSCROLL
oncmd gosub *v_scr,WM_VSCROLL
//画面に何か描く
pos 0,0 : mes "あいうえお"
//画面にオブジェクトを配置
dum1="" : dum2=""
x_mb1=0 : y_mb1=30 //一個目のオブジェクトの座標
pos x_mb1,y_mb1
mesbox dum1,800,270,1
h_mb1=objinfo(stat,2) //一個目のオブジェクトのハンドル
x_mb2=0 : y_mb2=300 //二個目のオブジェクトの座標
pos x_mb2,y_mb2
mesbox dum2,800,300,1
h_mb2=objinfo(stat,2) //二個目のオブジェクトのハンドル
stop
*h_scr
//横スクロール
type=0
s_pos=scrinfo_h(5)
goto *scr
*v_scr
//縦スクロール
type=1
s_pos=scrinfo_v(5)
*scr
flag=1 //移動させたフラグ
switch wparam&0xFFFF
case 0 //左(上)矢印を押した
s_pos-=roll_arr
swbreak
case 1 //右(下)矢印を押した
s_pos+=roll_arr
swbreak
case 2 //左(上)空白を押した
s_pos-=roll_spc
swbreak
case 3 //右(下)空白を押した
s_pos+=roll_spc
swbreak
case 6 //左端(上端)へ
s_pos=0
swbreak
case 7 //右端(下端)へ
s_pos=65535
swbreak
case 4 //ドラッグ終了
case 5 //ドラッグ中
s_pos=(wparam>>16)&0xFFFF
swbreak
default
flag=0
swbreak
swend
if flag {
if type {
//縦スクロール
s_pos=limit(s_pos,0,scr_hei-win_hei)
//最終的な移動量
s_pos2=s_pos-scrinfo_v(5)
if s_pos2 {
//オブジェクトの座標を変更
y_mb1-=s_pos2
y_mb2-=s_pos2
//スクロールバーを移動
scrinfo_v(5)=s_pos
SetScrollInfo hwnd,SB_VERT,varptr(scrinfo_v),1
} else {
flag=0
}
} else {
//横スクロール
s_pos=limit(s_pos,0,scr_wid-win_wid)
//最終的な移動量
s_pos2=s_pos-scrinfo_h(5)
if s_pos2 {
//オブジェクトの座標を変更
x_mb1-=s_pos2
x_mb2-=s_pos2
//スクロールバーを移動
scrinfo_h(5)=s_pos
SetScrollInfo hwnd,SB_HORZ,varptr(scrinfo_h),1
} else {
flag=0
}
}
}
if flag {
//画面(オブジェクト以外)をスクロール
groll scrinfo_h(5),scrinfo_v(5)
//オブジェクトを移動
SetWindowPos h_mb1,0,x_mb1,y_mb1,0,0,SWP_NOSIZE | SWP_NOZORDER| SWP_FRAMECHANGED
SetWindowPos h_mb2,0,x_mb2,y_mb2,0,0,SWP_NOSIZE | SWP_NOZORDER| SWP_FRAMECHANGED
}
return