;
; モジュール mod_progbox
;
;プログレスボックス操作モジュールです。
;・llmod3.hspのprogboxモジュールを参考に構築しているため、progbox.hspとの併用はできません。
;・llmod3.hspを使用する必要がないため、user32.as等との併用が可能です。
;・一部命令は仕様がほぼ同じため、マニュアルはllmod3.hspのprogboxモジュールのものを流用できる場合があります。
;・winobj命令を使用しているため、通常のオブジェクト同様にclrobj命令やcls命令、objsize命令などが使用できます。
;
; mod_progboxモジュール命令一覧
;
; progbox プログレスボックスの作成
; sel_progbox 操作するプログレスボックスを選択
; progrng プログレスボックスの範囲を設定
; progset プログレスボックスの各設定
; progmqe 未定プログレスボックスの設定(XP以降のみ対応)
; progstate プログレスボックスの状態の設定(Vista以降のみ対応)
;
;#####################################################################
#module "_progbox"
;
;
; ウィンドウメッセージ
#define PBM_SETRANGE 0x0401 ;範囲のセット
#define PBM_SETPOS 0x0402 ;位置をセット
#define PBM_DELTAPOS 0x0403 ;特定の量を増加させる
#define PBM_SETSTEP 0x0404 ;進む量のセット
#define PBM_STEPIT 0x0405 ;進ませる
#define PBM_SETRANGE32 0x0406 ;範囲で設定できる最大値の変更 ; Internet Explorer 3.0 〜
#define PBM_GETRANGE 0x0407
#define PBM_GETPOS 0x0408
#define PBM_SETBARCOLOR 0x0409 ;目盛りの色 ; Internet Explorer 4.0 〜
#define PBM_SETBKCOLOR 0x2001 ;目盛りの後ろの色
#define PBM_SETMARQUEE 0x040A ;未定プログレスバー ; Windows XP 〜
#define PBM_GETSTEP 0x040D ; Windows Vista 〜
#define PBM_GETBKCOLOR 0x040E
#define PBM_GETBARCOLOR 0x040F
#define PBM_SETSTATE 0x0410 ;状態を設定
#define PBM_GETSTATE 0x0411 ;状態を取得
; ウィンドウスタイル
#define PBS_SMOOTH 0x01 ;処理の進捗状況を塗りつぶし色で表示。(通常は、小さな正方形の連なりで表示) ; Internet Explorer 3.0 〜
#define PBS_VERTICAL 0x04 ;垂直目盛り
#define PBS_MARQUEE 0x08 ;未定プログレスバー ; Windows XP 〜
#define PBS_SMOOTHREVERSE 0x10 ;PBM_SETPOSで数値を減らす方向に設定してもスムーズに変化させる。 ; Windows Vista 〜
; バーの状態
#define PBST_NORMAL 0x0001 ;処理中 ; Windows Vista 〜
#define PBST_ERROR 0x0002 ;エラー
#define PBST_PAUSED 0x0003 ;一時停止
;
; 拡張ウィンドウスタイル
;
#define WS_EX_DLGMODALFRAME 0x00000001 ;二重の境界線
#define WS_EX_CLIENTEDGE 0x00000200 ;縁が沈んで見える境界線
#define WS_EX_STATICEDGE 0x00020000 ;ユーザーの入力を受け付けない項目用の、立体的に見える境界スタイル
;---------------------------------------
;
; プログレスボックスの作成
;
;progbox int p_sx,int p_sy,int p_style int p_exstyle
;p_sx : 幅
;p_sy : 高さ
;p_style : スタイル
;p_exstyle = 0〜3(0) :拡張スタイル
;stat : プログレスボックスのオブジェクトID
;
;プログレスボックスを作成します。
;プログレスボックスは、進捗状況を表示するのに便利です。
;幅や高さを省略するとobjsizeで設定した幅、高さが使われます。
;
;スタイル(comctl32.dllのバージョンが4.70以上でなければ無効です)
;p_styleの値
; 0 デフォルト デフォルトの設定で作成されます。
; 1 (PBS_SMOOTH) 進み方がスムーズになります。処理の進捗状況を塗りつぶし色で表示。(通常は、小さな正方形の連なりで表示)
; 4 (PBS_VERTICAL) 垂直に目盛りが進みます。
; 8 (PBS_MARQUEE) 未定プログレスバー(マーキー。横に流れるタイプ)になります。(XP以降)
; 10 (PBS_SMOOTHREVERSE) (Vista以降)
;
;p_exstyleの値
;0 デフォルト
;1 二重の境界線
;2 縁が沈んで見える境界線
;4 ユーザーの入力を受け付けない項目用の、立体的に見える境界スタイル
;
#deffunc progbox int p_sx,int p_sy,int p_style, int p_exstyle
m = 0
if p_exstyle & 1 : m |= WS_EX_DLGMODALFRAME ;二重の境界線
if p_exstyle & 2 : m |= WS_EX_CLIENTEDGE ;縁が沈んで見える境界線
if p_exstyle & 4 : m |= WS_EX_STATICEDGE ;ユーザーの入力を受け付けない項目用の、立体的に見える境界スタイル
winobj "msctls_progress32",
"", m, $
50000000 | p_style, p_sx, p_sy
handle_of_prog = stat
;未定プログレスバーを有効にする
if p_style & PBS_MARQUEE {
sendmsg objinfo(handle_of_prog,
2),
PBM_SETMARQUEE,
1 }
return handle_of_prog
;---------------------------------------
;
; 操作するプログレスボックスを選択
;
;sel_progbox int n1
;n1 : プログレスボックスのオブジェクトID
;
;この命令使用後はn1で指定したプログレスボックスに対して各操作を行います。
;プログレスボックス新規に作成すると、自動的にそのプログレスボックスが
;各操作の対象になります。
;複数のプログレスボックスを作成したときは、この命令で操作するプログレス
;ボックスを選択してください。
;
#deffunc sel_progbox int _v1
stt = handle_of_prog
handle_of_prog = _v1
return stt
;---------------------------------------
;
; プログレスボックスの範囲の設定
;
;progrng int n1,int n2,int n3
;n1=0〜 : 最小値
;n2=〜65535 : 最大値
;n3=0〜1 : 最大値の拡張フラグ
;stat : 以前セットしていた範囲
;
;プログレスボックスの範囲の設定をします。
;設定できる値は、最小値が0以上、最大値は65535以下です。
;n3に1を代入すると最大値が$ffffffffまでになります。ただしこの設定は
;comctl32.dllのバージョンが4.70以上でなければ無効です。
;
;stat値
;以前セットしていた範囲 [ 最小値 | (最大値<<16)]の形式 (n3=0のときのみ)
;
#deffunc progrng int _v1,int _v2,int _v3
v1 = _v1
v2 = _v2
if _v3 {
;// lParam = high, wParam = low
m = PBM_SETRANGE32
} else {
;範囲のセット
v2 = v1 | (v2 << 16)
m = PBM_SETRANGE : v1 = 0
}
sendmsg objinfo(handle_of_prog,
2),m,v1,v2
return
;---------------------------------------
;
; プログレスボックスの各設定
;
;progset n1, n2
;n1 : セットする値
;n2 : セットするタイプ
;
; プログレスボックスの各設定を行います。
; セットするタイプは以下の通りです。
;
;目的 n1の値 n2の値 progset実行後のstatの値
;進ませる 0 0 進ませる前の位置
;進ませる量のセット 進ませる量 0 以前セットした進ませる量
;位置をセット セットする位置 1 セットする前の位置
;特定の量を増加させる 増加させる量 2 増加させる前の位置
;目盛りの色 色 3 セットする前の色
;目盛りの後ろの色 色 4 セットする前の色
;
;n2の値が3,4のものはcomctl32.dllのバージョンが4.70以上でなければ無効です。
;色は r|(g<<8)|(g<<16) の形式
;値が 0 になっている所は省略できる。
;
;statの値が'セットする前の色'となっている所は、セットする前の色がシステムの
;デフォルトの色だった場合 -16777216($ff000000)がstatに代入されます。また、色を
;セットするときに$ff000000を使うとシステムのデフォルトの色に設定できます。
;
;【例】
; progbox 300,20 ;幅300,高さ20のプログレスボックスを作る
; progrng 0,200 ;範囲は0から200
;
;*lp
; progset ;目盛りを進ませる
; ;
; ;
; goto lp
;
#deffunc progset int _v1,int _v2
v1 = _v1
v2 = _v2
if v2 {
;PBM_SETPOS 位置をセット
;PBM_DELTAPOS 特定の量を増加させる
;PBM_SETBARCOLOR 目盛りの色
;PBM_SETBKCOLOR 目盛りの後ろの色
m = 0, PBM_SETPOS, PBM_DELTAPOS, PBM_SETBARCOLOR, PBM_SETBKCOLOR
m = m(v2)
if v2 < 3 : v2 = 0 : else : v2 = v1 : v1 = 0
} else {
if v1 {
;進む量のセット
m = PBM_SETSTEP : v2 = 0
} else {
;進ませる
m = PBM_STEPIT : v1 = 0 : v2 = 0
}
}
sendmsg objinfo(handle_of_prog,
2), m, v1, v2
return
;---------------------------------------
;
; 未定プログレスボックスの設定
;
;progmqe int v1, int v2
;v1 :有効・停止フラグ
;v2 :メモリの速さ(ms)
;
;この命令はprogbox命令でスタイルに8(未定プログレスボックス)を指定したプログレスボックスに対してのみ有効です。
;この命令はXP以降でのみ対応しています。
;
;未定プログレスボックスとは未定プログレスバーのことで、
;バーの長さが少しずつ増えていくのではなく、左から右に流れるタイプのプログレスバーです。
;
;未定プログレスボックスの動作の設定を行います。
;v1に0を指定すると未定プログレスボックスの動作が停止します。
;v1に1を指定すると未定プログレスボックスが動作します。
;通常は1を指定します。
;
;v2はメモリの速さです。値を大きくするとゆっくり動くようになります。
;
#deffunc progmqe int _v1, int _v2
;マーキー
;XP以降のみ対応
v1 = _v1 ! 0 ;1で有効
v2 = _v2 ;メモリの速さ(ミリ秒)
sendmsg objinfo(handle_of_prog,
2),
PBM_SETMARQUEE, v1, v2
return
;---------------------------------------
;
; プログレスボックスの状態の設定
;
;progstate v1, v2
;v1 :状態
; 0:処理中
; 1:エラー
; 2:一時停止
;v2 :フラグ
; 0:設定する
; 1:取得する
;
;プログレスボックスの状態を設定または取得します。
;この命令はVista以降のみ対応しています。
;
;v1にコントロールの状態を指定します。
; 0:処理中
; 1:エラー
; 2:一時停止
;
;v2に0を指定すると、状態を設定します。
;
;v2に1を指定すると、現在の状態を取得します。
;statに現在の状態が返ります。
; 0:処理中
; 1:エラー
; 2:一時停止
;v1の設定は無効になります。
;
#deffunc progstate int _v1, int _v2
if _v2 = 0 {
v1 = PBST_NORMAL, PBST_ERROR, PBST_PAUSED
v1 = v1( limit(_v1, 0, 2) )
sendmsg objinfo(handle_of_prog,
2),
PBM_SETSTATE, v1,
0 return
} else {
sendmsg objinfo(handle_of_prog,
2),
PBM_GETSTATE, v1,
0 z = stat
res = -1 ;エラー
if z = PBST_NORMAL : res = 0
if z = PBST_ERROR : res = 1
if z = PBST_PAUSED : res = 2
return res
}
return
#global
;#####################################################################
;
; 実行サンプル
;
;ここからコメント----------
#if 0 ;0のときコメントになります。1でコメント解除。
; プログレスボックスの作成
progbox 300,50
id = stat
; 範囲をセット
progrng 0, 1000 ;0〜1000
; 進ませる量のセット
progset 100, 0 ;50step
; 進ませる
repeat 8
progset 0, 0 ;進ませる
await 1000
loop
; 位置をセット
progset 500, 1 ;500
; 特定の量を増加させる
progset 250, 2 ;250(初期位置250+増加250=現在位置500)
; 目盛りの色
r=0 : g = 0 : b = 255
progset r|(g<<8)|(g<<16), 3 ;(0, 0, 255)
; 目盛りの後ろの色
r=255 : g = 0 : b = 0
progset r|(g<<8)|(g<<16), 4 ;(255, 0, 0)
; 未定プログレスボックス
progbox 300, 20, 8
progbox 300, 20, 8
progmqe 1, 10 ;メモリの速さを変更
progbox 300, 20, 8
wait 100 : progmqe 0 ;停止
; 状態の変更と取得
m = "通常", "エラー", "一時停止", "状態が取得できませんでした。"
;通常
progbox 300, 20
progset 50, 1
progstate 0 ;通常
progstate , 1 ;状態を取得
z = stat : if z<0 : z = 3
;エラー
progbox 300, 20
progset 50, 1
progstate 1 ;エラー
progstate , 1 ;状態を取得
z = stat : if z<0 : z = 3
;一時停止
progbox 300, 20
progset 50, 1
progstate 2 ;一時停止
progstate , 1 ;状態を取得
z = stat : if z<0 : z = 3
stop
#endif
;コメントここまで----------