[Top Page][Edit][Discussion][Edit History][All Pages][Recent Changes][->Japanese]

ウインドウにスクロールバーを付ける

ウインドウにスクロールバーを付ける


始めに

http://smile.poosan.net/perl-bin/hsp/ver3/hsp3.cgi?print+200511/05110003.txt
から ぷまさんに許可を取り転載しました。
詳しいやり取りなどは上記ページを参照してください Shark++

スクロールバー追加モジュール

//  2005/12/14修正済み (Ver0.96)
#module "scrlbar"
//-----------------------
#uselib "user32"
#func   GetWindowLongA "GetWindowLongA" int,int
#func   SetWindowLongA "SetWindowLongA" int,int,int
#func   ShowScrollBar  "ShowScrollBar"  int,int,int
#func   SetScrollInfo  "SetScrollInfo"  int,int,var,int
#func   SetScrollPos   "SetScrollPos"   int,int,int,int
#func   SetWindowPos   "SetWindowPos"   int,int,int,int,int,int,int
//-----------------------

// 水平 垂直スクロールバーを使えるようにする
#deffunc ScrollBar 

 oncmd gosub *WMSIZE,   5
 oncmd gosub *SCROLL,   $114
 oncmd gosub *SCROLL,   $115

        si= 28, 31, 0,0,0,0,0   // SCROLLINFO構造体
        wx.ginfo_sel= ginfo_sizex+ginfo_sx-ginfo_winx
        wy.ginfo_sel= ginfo_sizey+ginfo_sy-ginfo_winy

;                                     WS_VSCROLL|WS_HSCROLL|WS_SIZEBOX
        GetWindowLongA hwnd,-16 : SetWindowLongA hwnd,-16,stat|$340000
        
        SetWindowPos hWnd, 0, 0, 0, 0, 0, $37 ; screen 0, bgscr用        
        return 1

*WMSIZE //ウィンドウサイズが変更された時の処理
        sel=ginfo_sel: gsel ginfo_intid
        repeat 2
                si.3= ginfo(26+cnt), ginfo(12+cnt), ginfo(8+cnt)
                SetScrollInfo hWnd, cnt, si, 1
        loop
        groll ginfo_vx, ginfo_vy
        mref bm,67 : bm.20=ginfo_winx, ginfo_winy

        hHide= wx.ginfo_intid= ginfo_sizex ;gsel selを確実に実行させるため
        vHide= wy.ginfo_intid= ginfo_sizey
        wnd=hwnd : gsel sel ;何故かスクロールバーが描画されない環境があるため

        if hHide=1: ShowScrollBar wnd, 0, 0:else: SetWindowPos Wnd, 0,0,0,0,0,$37
        if vHide=1: ShowScrollBar wnd, 1, 0:else: SetWindowPos Wnd, 0,0,0,0,0,$37
        return 1

*SCROLL //スクロールバー操作時の処理
        sel=ginfo_sel : gsel ginfo_intid
        m=iparam=$115 : nPos=ginfo(8+(m=1))
        Code= wParam &$ffff
        repeat 1
                if Code= 5 : nPos=wParam>>16&$ffff : break ;TB_THUMBTRACK
                if Code= 0 : nPos-4     : break            ;TB_LINEUP
                if Code= 1 : nPos+4     : break
                if Code= 2 : nPos-32: break
                if Code= 3 : nPos+32
        loop
        SetScrollPos hWnd, m, nPos, 1
        if m : groll ginfo_vx, nPos :else: groll nPos, ginfo_vy
        gsel sel : return 1
#global
;-----------------------

//StyleAdd ハンドル,スタイル,追加(0)or削除(1) (+2で 拡張ウィンドウスタイル)

#uselib "user32.dll"
#func  global SetLong "SetWindowLongA" int, int, int
#cfunc global GetLong "GetWindowLongA" int, int
#define global StyleAdd(%1, %2=0, %3=0)ujw=((%3)&2)*-2-16 :\
        SetLong %1, ujw, GetLong(%1, ujw)|(%2)^((%3)&1)*(%2)
#define 拡張 2
#define 削除 1

;-----------------------
onexit gosub *owari
screen 0
        title "screen 0"
        picload dir_exe+"\\sample\\hspdx\\HSPDX.BMP"
        ScrollBar
        width 400, 300
screen 1
        title "サイズ変更してみてください(^^)v"
        picload dir_exe+"/sample/demo/JP6GIRL.BMP"
        ScrollBar

;       WS_MINIMIZEBOX, を削除(1) (+0 ウィンドウスタイル)
        StyleAdd hwnd, $20000, 1+0

        gsel ginfo_sel, -1 : gsel ginfo_sel, 1
        ScrollBar
        stop
        
*owari
        if iparam|wparam=0:end
        wait 20:gsel wparam, -1:return