HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0406
backdrophsp3util.as>>scrollbar3解決


backdrop

リンク

2010/4/6(Tue) 10:11:21|NO.31812

ScrollBarでウィンドウ内をスクロールするにはどうしたらよいのでしょうか?



この記事に返信する


あり

リンク

2010/4/7(Wed) 10:50:04|NO.31836

scrollbar命令って現状では設置は出来るけど
操作する命令が無いんですよね(汗)

scrollbarの説明だとsendmsgが推奨(?)されていますが
ざっと探した限りでは情報がみつからなかったので
Win32API関数を使った方法も入れておきます。

#include "hsp3util.as" #include "user32.as" #define SB_CTL $00000002 #define SIF_ALL $00000017 #define WM_HSCROLL $00000114 #define SBM_GETSCROLLINFO $000000EA #define SBM_SETSCROLLINFO $000000E9 screen 0, 1280, 480, , , ,640, 480 color 255 redraw 0 repeat 1280 line 0, 0, cnt, 480 loop redraw 1 pos 0, 460 scrollbar 640, 20 scb_hwnd=objinfo(stat, 2) ;スクロールバーのハンドル dim SCROLLINFO, 7 ;SCROLLINFO構造体 SCROLLINFO(0)=28 ;cbSize 構造体のサイズ SCROLLINFO(1)=SIF_ALL ;fMask SCROLLINFO(2)=0 ;nMin スクロール幅の最小値 SCROLLINFO(3)=640 ;nMax スクロール幅の最大値 SCROLLINFO(4)=0 ;nPage スクロールする値 SCROLLINFO(5)=0 ;nPos スクロール位置 SCROLLINFO(6)=0 ;nTrackPos つまみの位置 ; sendmsg、APIのどちらでも動作は同じ? ;sendmsg scb_hwnd, SBM_SETSCROLLINFO, 0, varptr(SCROLLINFO) SetSCROLLINFO scb_hwnd, SB_CTL, varptr(SCROLLINFO), 1 oncmd gosub *SCB_MOVE, WM_HSCROLL stop *SCB_MOVE ;sendmsg scb_hwnd, SBM_GETSCROLLINFO, 0, varptr(SCROLLINFO) GetSCROLLINFO scb_hwnd, SB_CTL, varptr(SCROLLINFO) title "スクロールバーの位置 "+SCROLLINFO(6) SCROLLINFO(5)=SCROLLINFO(6) ;sendmsg scb_hwnd, SBM_SETSCROLLINFO, 0, varptr(SCROLLINFO) SetSCROLLINFO scb_hwnd, SB_CTL, varptr(SCROLLINFO), 1 groll SCROLLINFO(5), 0 return
かなり大雑把なのでつっこみ所は多いと思いますが
こんな感じで動かせました。
ちゃんとプログラムすれば縦スクロールや、より細かい制御も可能なので
http://msdn.microsoft.com/ja-jp/library/cc430235(v=MSDN.10).aspx
http://www.kumei.ne.jp/c_lang/
http://wisdom.sakura.ne.jp/
等のサイトの解説などを参考にしてみて下さい。



backdrop

リンク

2010/4/7(Wed) 11:16:02|NO.31837

ありがとうございます!



あり

リンク

2010/4/13(Tue) 11:38:34|NO.31961

先のサンプルがあまりにも適当だったので少しだけマシな物を作りました。

#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



ONION software Copyright 1997-2021(c) All rights reserved.