C#でWindows Media Player ActiveX コントロールを使う その4
chakemiです。今日は前回、宣言していたシークバー機能をCtlcontrols.currentPositionを使って実装したいと思います。
シークバーには、TrackBarコントロールを用いようと思います。 前回の続きに、TrackBarコントロールを配置します。
TrackBarの最大値(Maximumプロパティ)が動画の長さとなるようにするため、currentMedia.durationプロパティから動画の長さを取得します。 スライダーの位置(Valueプロパティ)を再生位置に移動させるために、Ctlcontrols.currentPositionから現在の値を取得します。
※currentMedia.durationプロパティ、Ctlcontrols.currentPositionプロパティはdouble型ですが、 TrackBarのMaximumプロパティ、Valueプロパティはint型の為キャストする必要がある点だけ注意。
で、あとは、第二回の時に、実装した再生位置の更新のためのtimer1_Tickイベントハンドラ内で TrackBarのValueプロパティも更新してあげれば良いわけですね。
1 2 3 4 5 |
|
で、ここで肝心なのがどのタイミングで動画の長さを取得するかです。
悪い例として
1 2 3 4 5 6 7 8 9 10 |
|
上記のように再生開始直後に取得した場合、「’Value’ は ‘Minimum’ と ‘Maximum’ の間でなければなりません。」みたいなエラーが発生するかと思います。 ブレークポイントを挿入して、ローカルウィンドウから確認するとわかるように Maximumプロパティには、0が入っているかと思います。
ここで第3回の時に、OpenStateChangeイベントで、axWindowsMediaPlayerコントロールの状態を確認した時のことを思い出してください。 再生を開始した瞬間、バババッとステータスが変化していたかと思います。
再生を開始した瞬間ではロードが完了していないため、値が取得できていなかったわけですね。
では、メディアが開いた後に取得するようにすればいいということで、前回実装したOpenStateChangeイベントハンドラ内に 記述します。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
これで、再生時間にあわせて、スライダーの位置が移動するようになりました~。
後は、スライダーを動かしてして再生位置を移動させればシークバーとして完成ですが、 これには、TrackBarのScrollイベントで、TrackBarのValueをCtlcontrols.currentPositionにセットしてあげればいいわけですね~。
フォームデザイナでTrackBarを選択し、Scrollイベントハンドラを生成します。
1 2 3 4 |
|
これで、シークバーとしての機能が実装できました~。
マウス操作中の挙動を制御したいのであれば、TrackBarのMouseDownイベント、MouseUpイベントを使ってTimerを停止、開始を制御すれば ドラッグ中にスライダーが動いてしまうこともないでしょう~。
長くなりましたが、これで一旦「Windows Media Player ActiveX コントロール」をテーマにした記事を終了とします。