ページ 1 / 1
プログレスバー
Posted: 2007年8月03日(金) 16:39
by M.S.
今、AB 4.24 で BackSearchAB に載っているボリュームメーターを作っています。
音量をプログレスバーに表示させているのですが、
音量の値は "-134217728 ~ 134217728" を返してくるので、
プログレスバーの最小値を "0"、
最大値を "134217728" にしてコンパイル&実行しても、
プログレスバーが動きません。
どうしてでしょうか?
どなたか教えてください。
※ボリュームメーターのコードは BackSearchAB を参照してください。
メーターは精度の良いタイマーを使って、
10ms 毎に動かしています。
Posted: 2007年8月03日(金) 23:11
by konisi
プログレスバーを操作する関数 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Const PBM_SETRANGE=WM_USER+1
Const PBM_SETPOS=WM_USER+2
Sub SetProgressValue(hWnd As HWND,ID As Long,Percent As Double,Accuracy As DWord)
'hWnd : プログレスバーを所有するウインドウのハンドル
'ID : プログレスバーのID
'Percent : プログレスバーにセットする値 0~100の間の実数で指定する。はみ出した場合は最も近い定義域に補正される。
'Accuracy : プログレスバーの描画精度 1以下や65536以上にした時の挙動は未定義。
SendMessage(GetDlgItem(hWnd,ID),PBM_SETRANGE,0,Accuracy*&H10000)
Percent=Percent/100
If Percent>1 then Percent=1
If Percent<0 then Percent=0
SendMessage(GetDlgItem(hWnd,ID),PBM_SETPOS,Int(Percent*Accuracy),0)
End Sub
プログレスバーとボタンがあるウインドウで、
ウインドウハンドル:hMainWnd
プログレスバーのID:ProgressBar1
ボタンのID:CommandButton1
の時の使用例↓
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
SetProgressValue(hMainWnd,ProgressBar1,50,65535)
End Sub
今回の場合の仮想的なコード
コード: 全て選択
Dim Volume As Double
Sub MainWnd_Timer()
SetProgressValue(hMainWnd,ProgressBar1,Abs(Volume)/134217728*100,65535)
End Sub
こんな感じでどうでしょうか?
Posted: 2007年8月04日(土) 09:18
by M.S.
>
プログレスバーを操作する関数 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Const PBM_SETRANGE=WM_USER+1
> Const PBM_SETPOS=WM_USER+2
>
> Sub SetProgressValue(hWnd As HWND,ID As Long,Percent As Double,Accuracy As DWord)
> 'hWnd : プログレスバーを所有するウインドウのハンドル
> 'ID : プログレスバーのID
> 'Percent : プログレスバーにセットする値 0~100の間の実数で指定する。はみ出した場合は最も近い定義域に補正される。
> 'Accuracy : プログレスバーの描画精度 1以下や65536以上にした時の挙動は未定義。
> SendMessage(GetDlgItem(hWnd,ID),PBM_SETRANGE,0,Accuracy*&H10000)
> Percent=Percent/100
> If Percent>1 then Percent=1
> If Percent<0 then Percent=0
> SendMessage(GetDlgItem(hWnd,ID),PBM_SETPOS,Int(Percent*Accuracy),0)
> End Sub
>
> プログレスバーとボタンがあるウインドウで、
> ウインドウハンドル:hMainWnd
> プログレスバーのID:ProgressBar1
> ボタンのID:CommandButton1
> の時の使用例↓
>
>
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
> SetProgressValue(hMainWnd,ProgressBar1,50,65535)
> End Sub
>
> 今回の場合の仮想的なコード
>
コード: 全て選択
Dim Volume As Double
>
> Sub MainWnd_Timer()
> SetProgressValue(hMainWnd,ProgressBar1,Abs(Volume)/134217728*100,65535)
> End Sub
> こんな感じでどうでしょうか?
konisi さん、ありがとうございます!
動作は完璧です!
プログレスバーの描画精度 1以下や65536以上にした時の挙動は未定義だったんですね。
初めて知りました。