プログレスバー モジュール

HSPでプログレスバーを扱うためのモジュールです。
プログレスバーは処理の進行状況などを視覚的に表すコントロールで、処理に時間がかかるような場合に進捗を示すために用いられたりします。
間違ってもヒットポイントゲージの代わりなどに使用するものではないです。

モジュールの概要

モジュールの使い方

下記のモジュールをスクリプトにコピペするだけで使用できます。
DLLやモジュールを別途用意する必要はありませんが、WindowsAPI(Win32API)を使用しますので環境に依存しています。
また、プログレスバーコントロールはOSのバージョンにより見た目や利用できる機能に差があります。このモジュールはWindows7で作成・テストしています。
命令・関数名パラメータパラメータの説明
ProgBar_Create
プログレスバーを設置する
int n [pixel] (コントロールの横幅)
intn [pixel] (コントロールの縦幅)
int
0 (指定なし)
+1 (縦にバーが伸びる)
+2 (なめらかに減る)
普通、なめらかに増え、減るときは一瞬
int最小値、バーがまったくないときの値
int最大値、いっぱいになったときの値
int1Stepの増加量
int初期値
(stat)オブジェクトID
ProgBar_SetRange
設置後に設定値を変更する
int 対象のオブジェクトID
int最小値、バーがまったくないときの値
int最大値、いっぱいになったときの値
int1Stepの増加量
val = ProgBar_GetPos( )
現在位置を取得する
int 対象のオブジェクトID
stat現在の位置
ProgBar_SetPos
現在の位置を設定する
int 対象のオブジェクトID
int新しい値
ProgBar_Step
1Step進める
int 対象のオブジェクトID
val = ProgBar_GetEnable( )
今の状態を取得する
int 対象のオブジェクトID
stat
0 (待機中)
1 (通常)
2 (エラー状態)
3 (ポーズ状態)
ProgBar_SetEnable
今の状態を設定する
int 対象のオブジェクトID
int
0 (待機中)
1 (通常)
2 (エラー状態)
3 (ポーズ状態)
int
待機中の場合のみ
バーの中を走る光の速さ
パラメータは上から。int:数値、stat:関数の返す値、(stat):システム変数。

モジュール

/*====================================================================
          プログレスバーモジュール(ControlObjectModule2.2号)
HSP3.3RC1       2011. 8. 4  暫定作成
HSP3.3          2011.11. 6  修正:CreateでObjIDが返るように
----------------------------------------------------------------------
プログレスバーを設置する
    ProgBar_Create 横幅, 縦幅, flag, 最小値, 最大値, 1Stepの増加量, 現在位置
        flag    +1(縦型にする)  +2(減量の時もなめらかに動く)
        stat    オブジェクトID

プログレスバーの範囲を指定する
    ProgBar_SetRange オブジェクトID, 最小値, 最大値, 1ステップの増加量

プログレスバーの現在の位置を取得する関数
    ProgBar_GetPos( オブジェクトID )

プログレスバーの位置を指定する
    ProgBar_SetPos オブジェクトID, 新しい位置

プログレスバーの値を1ステップ進める
    ProgBar_Step オブジェクトID

プログレスバーの現在の状態を取得する関数
    ProgBar_GetEnable( オブジェクトID )
        stat    0(待機中) or 1(通常) or 2(エラー状態) or 3(ポーズ状態)

プログレスバーの現在の状態を指定する
    ProgBar_SetEnable オブジェクトID, flag, speed
        flag    プログレスバーをどの状態にするかを示す数値
                0(待機中) or 1(通常) or 2(エラー状態) or 3(ポーズ状態)
        speed   待機中の場合、バーの中を走る光の速さを指定できる(大きいほど遅い)

====================================================================*/
#ifndef ProgressBarModuleIncluded
#define ProgressBarModuleIncluded
#module ProgressBarModule
#define PBM_GETRANGE        $0407   ;バーの取りうる値の有効範囲
#define PBM_SETRANGE        $0401   ;   lparam = (最大<<16)|最小
#define PBM_SETRANGE32      $0406   ;   wparam = どっちか  lparam = そっち
#define PBM_GETPOS          $0408   ;現在の値
#define PBM_SETPOS          $0402
#define PBM_DELTAPOS        $0403   ;ステップした時に何所に止まるかの値を返すかも?
#define PBM_STEPIT          $0405   ;1ステップする
#define PBM_GETSTEP         $040D   ;ステップした時の増減値
#define PBM_SETSTEP         $0404
#define PBM_GETBARCOLOR     $040F   ;テーマが無効のとき、有効!?
#define PBM_SETBARCOLOR     $0409
#define PBM_GETBKCOLOR      $040E   ;テーマが有効のとき、無効!?
#define PBM_SETBKCOLOR      $2001
#define PBM_SETMARQUEE      $040A   ;待機中的なやつ wparam=1/0  lparam=speed
#define PBM_GETSTATE        $0411   ;バーの状態
#define PBM_SETSTATE        $0410
#define     PBST_NORMAL         $0001   ;ふつう
#define     PBST_ERROR          $0002   ;エラー終了したよみたいな
#define     PBST_PAUSED         $0003   ;ポーズ状態(ユーザー入力待ちの時とか。。。)

#define WS_CHILD            $40000000   ;いつもの
#define WS_VISIBLE          $10000000   ;いつもの
#define PBS_SMOOTH          $00000001   ;なめらかに伸びる(?)
#define PBS_VERTICAL        $00000004   ;縦に伸びるやつ
#define PBS_MARQUEE         $00000008   ;待機中的な?
#define PBS_SMOOTHREVERSE   $00000010   ;値が減る時もなめらかに動く

#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int, int, int
#func GetWindowLong "GetWindowLongA" int, int
#define GWL_STYLE   -16

#deffunc ProgBar_Create int x, int y, int f, int n, int m, int s, int p, local i
    ib = WS_CHILD | WS_VISIBLE | PBS_SMOOTH; | PBS_MARQUEE
    if f & 1  : ib = ib | PBS_VERTICAL          ;縦要素
    if f & 2  : ib = ib | PBS_SMOOTHREVERSE     ;なめらかにプリン要素
    winobj "msctls_progress32", "", 0, ib, x, y, 0, 0  : i = stat
    ProgBar_SetRange i, n, m, s
    ProgBar_SetPos i, p
    return i

#deffunc ProgBar_SetRange int i, int n, int m, int s
    sendmsg objinfo(i, 2), PBM_SETRANGE32, n, m
    sendmsg objinfo(i, 2), PBM_SETSTEP, s, 0
    return

#defcfunc ProgBar_GetPos int i
    sendmsg objinfo(i, 2), PBM_GETPOS, 0, 0
    return stat

#deffunc ProgBar_SetPos int i, int p
    sendmsg objinfo(i, 2), PBM_SETPOS, p, 0
    return

#deffunc ProgBar_Step int i
    sendmsg objinfo(i, 2), PBM_STEPIT, 0, 0
    return

#defcfunc ProgBar_GetEnable int i
    GetWindowLong objinfo(i, 2), GWL_STYLE  : if stat & PBS_MARQUEE  : return 0 ;待機中
    sendmsg objinfo(i, 2), PBM_GETSTATE, 0, 0
    if stat == PBST_NORMAL  : return 1
    if stat == PBST_ERROR   : return 2
    if stat == PBST_PAUSED  : return 3
    return -1

#deffunc ProgBar_SetEnable int i, int f, int p
    ib = ProgBar_GetEnable(i)  : if f == ib  : return   ;変わらない。
    if ib == 0 {                                        ;無効状態?から有効状態になるとき
        GetWindowLong objinfo(i, 2), GWL_STYLE
        SetWindowLong objinfo(i, 2), GWL_STYLE, stat ^ PBS_MARQUEE  ;フラグをさげとく。
    }
    if f == 0 {
        GetWindowLong objinfo(i, 2), GWL_STYLE
        SetWindowLong objinfo(i, 2), GWL_STYLE, stat | PBS_MARQUEE  ;フラグづけ。
        sendmsg objinfo(i, 2), PBM_SETMARQUEE, 1, p
    }
    if f == 1  : sendmsg objinfo(i, 2), PBM_SETSTATE, PBST_NORMAL
    if f == 2  : sendmsg objinfo(i, 2), PBM_SETSTATE, PBST_ERROR
    if f == 3  : sendmsg objinfo(i, 2), PBM_SETSTATE, PBST_PAUSED
    return

; http://www.tvg.ne.jp/menyukko/ ; Copyright(C) 2011 衣日和 All rights reserved.
#global
#endif