/*--------- ---------- ---------- ---------- ---------- ; http://www.setsuki.com/ ;---------- ---------- ---------- ---------- ---------- ; 使用例) #include "scrollbar.as" screen 2,400,400,0,0,0,200,200 ; 適当な背景を設定 repeat 20 color rnd(255),rnd(255),rnd(255) boxf cnt\5*100,cnt/5*100,cnt\5*100+100,cnt/5*100+100 loop groll 10, 20 : gosub *OnSize ; スクロールバーの設定 oncmd gosub *OnScroll2, WM_HSCROLL oncmd gosub *OnScroll2, WM_VSCROLL oncmd gosub *OnSize , WM_SIZE screen 0,300,450 ; 横スクロールバーを設定 pos 16,0 : objsize ginfo_winx-16,16 scrollbar 0, 0,200, 100, 10 ; 縦スクロールバーを設定 pos 0,16 : objsize 16,ginfo_winy-16 scrollbar 1, 0,500, 20 ; スクロールバーの設定 oncmd gosub *OnScroll, WM_HSCROLL oncmd gosub *OnScroll, WM_VSCROLL stop *OnSize gsel 2 ; ウィンドウのスクロールバーを設定 ; (設定したら消えません;) scrollset hwnd, 0 scrollset hwnd, 1 return *OnScroll ; スクロールバーを動かす scrollmove lparam, 10 return *OnScroll2 ; ウィンドウのスクロールバーを動かす gsel 2 : scrollmove hwnd return ;---------- ---------- ---------- ---------- ---------*/ #include "user32.as" #define global WM_SIZE 0x0005 ;ウィンドウサイズ変更 #define global WM_HSCROLL 0x114 ;横スクロールバー #define global WM_VSCROLL 0x115 ;縦スクロールバー #define global SB_HORZ 0 ;標準スクロール水平バー #define global SB_VERT 1 ;標準スクロール垂直バー #define global SB_CTL 2 ;スクロールコントロール #define global SB_BOTH 3 ;標準スクロール両方? #const global SB_LINEUP 0 #const global SB_LINELEFT 0 #const global SB_LINEDOWN 1 #const global SB_LINERIGHT 1 #const global SB_PAGEUP 2 #const global SB_PAGELEFT 2 #const global SB_PAGEDOWN 3 #const global SB_PAGERIGHT 3 #const global SB_THUMBPOSITION 4 ;ドラッグの終了を取得 #const global SB_THUMBTRACK 5 ;ドラッグ中ずっと取得 #const global SB_TOP 6 #const global SB_LEFT 6 #const global SB_BOTTOM 7 #const global SB_RIGHT 7 #const global SB_ENDSCROLL 8 #const global SIF_RANGE 0x0001 #const global SIF_PAGE 0x0002 #const global SIF_POS 0x0004 #const global SIF_DISABLENOSCROLL 0x0008 #const global SIF_TRACKPOS 0x0010 #const global SIF_ALL (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS) #const global SIF_DEF (SIF_RANGE | SIF_PAGE | SIF_POS) #module "WindowScroolBar" ;---------- --------- ---------- ---------- ---------- ; スクロールバーの設定 ;---------- --------- ---------- ---------- ---------- #deffunc scrollbar int hScroll, int min, int max, int nPage, int nPos Sinfo = 28, SIF_DEF, min, max, nPage, nPos, 0 winobj "SCROLLBAR", "", 0, 0x50000000 | hScroll, w, h SetScrollInfo objinfo(stat,2), SB_CTL, varptr(Sinfo), 1 return ;---------- --------- ---------- ---------- ---------- ; スクロールバーの設定を変更 ;---------- --------- ---------- ---------- ---------- #deffunc scrollset int hScroll, int min, int max, int nPage, int nPos if( hScroll == hwnd ){ chk=min&1 Sinfo = 28, SIF_DEF, 0, ginfo( chk | 26 ), ginfo( chk | 12 ), ginfo( chk | 8 ), 0 } else { chk=SB_CTL Sinfo = 28, SIF_DEF, min, max, nPage, nPos, 0 } SetScrollInfo hScroll, chk, varptr(Sinfo), 1 return ;---------- --------- ---------- ---------- ---------- ; スクロールバーの動作処理 ;---------- --------- ---------- ---------- ---------- #deffunc scrollmove int hScroll, int min if iparam = WM_HSCROLL : chk=SB_HORZ : else { if iparam = WM_VSCROLL : chk=SB_VERT : else : return } if( hwnd != hScroll ): chk=SB_CTL size = min : if( min < 1 ): size = 1 GetScrollInfo hScroll, chk, varptr(Sinfo) flag = ( wparam & 0xFFFF ) if flag = SB_LINEUP : Sinfo.5 -= size : goto *@f if flag = SB_LINEDOWN : Sinfo.5 += size : goto *@f if flag = SB_PAGEUP : Sinfo.5 -= Sinfo.4 : goto *@f if flag = SB_PAGEDOWN : Sinfo.5 += Sinfo.4 : goto *@f if flag = SB_THUMBTRACK : Sinfo.5 = ( wparam >> 16 ) & 0xFFFF : goto *@f if flag = SB_TOP : Sinfo.5 = Sinfo.2 : goto *@f if flag = SB_BOTTOM : Sinfo.5 = Sinfo.3 : goto *@f return *@ SetScrollInfo hScroll, chk, varptr(Sinfo), 1 if( hwnd == hScroll ){ if( chk == SB_HORZ ){ groll Sinfo.5, ginfo(9) } else { groll ginfo(8), Sinfo.5 } } return ;---------- --------- ---------- ---------- ---------- ; スクロールバー情報を取得 ;---------- --------- ---------- ---------- ---------- #defcfunc scrollget int hScroll, int min GetScrollInfo hScroll, SB_CTL, varptr(Sinfo) return Sinfo.min ;---------- --------- ---------- ---------- ---------- #global screen 2,400,400,0,0,0,200,200 ; 適当な背景を設定 repeat 20 color rnd(255),rnd(255),rnd(255) boxf cnt\5*100,cnt/5*100,cnt\5*100+100,cnt/5*100+100 loop groll 10, 20 : gosub *OnSize ; スクロールバーの設定 oncmd gosub *OnScroll2, WM_HSCROLL oncmd gosub *OnScroll2, WM_VSCROLL oncmd gosub *OnSize , WM_SIZE screen 0,300,450 ; 横スクロールバーを設定 pos 16,0 : objsize ginfo_winx-16,16 scrollbar 0, 0,200, 100, 10 ; 縦スクロールバーを設定 pos 0,16 : objsize 16,ginfo_winy-16 scrollbar 1, 0,500, 20 ; スクロールバーの設定 oncmd gosub *OnScroll, WM_HSCROLL oncmd gosub *OnScroll, WM_VSCROLL stop *OnSize gsel 2 ; ウィンドウのスクロールバーを設定 ; (設定したら消えません;) scrollset hwnd, 0 scrollset hwnd, 1 return *OnScroll ; スクロールバーを動かす scrollmove lparam, 10 return *OnScroll2 ; ウィンドウのスクロールバーを動かす gsel 2 : scrollmove hwnd return