今、AB 4.24 で BackSearchAB に載っているボリュームメーターを作っています。
音量をプログレスバーに表示させているのですが、
音量の値は "-134217728 ~ 134217728" を返してくるので、
プログレスバーの最小値を "0"、
最大値を "134217728" にしてコンパイル&実行しても、
プログレスバーが動きません。
どうしてでしょうか?
どなたか教えてください。
※ボリュームメーターのコードは BackSearchAB を参照してください。
メーターは精度の良いタイマーを使って、
10ms 毎に動かしています。
プログレスバー
プログレスバーを操作する関数 [ここをクリックすると内容が表示されます]
プログレスバーとボタンがあるウインドウで、
ウインドウハンドル:hMainWnd
プログレスバーのID:ProgressBar1
ボタンのID:CommandButton1
の時の使用例↓
今回の場合の仮想的なコード
こんな感じでどうでしょうか?コード: 全て選択
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
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
>
konisi さん、ありがとうございます!
動作は完璧です!
プログレスバーの描画精度 1以下や65536以上にした時の挙動は未定義だったんですね。
初めて知りました。
プログレスバーを操作する関数 [ここをクリックすると内容が表示されます]
>
> プログレスバーとボタンがあるウインドウで、
> ウインドウハンドル:hMainWnd
> プログレスバーのID:ProgressBar1
> ボタンのID:CommandButton1
> の時の使用例↓
>
>
>
> 今回の場合の仮想的なコード
>
> こんな感じでどうでしょうか?コード: 全て選択
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以上にした時の挙動は未定義だったんですね。
初めて知りました。