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
private void timer1_Tick(object sender, EventArgs e)
{
    label1.Text = (axWindowsMediaPlayer1.Ctlcontrols.currentPositionString);
    trackBar1.Value = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}

で、ここで肝心なのがどのタイミングで動画の長さを取得するかです。

悪い例として

1
2
3
4
5
6
7
8
9
10
private void Button1_Click(object sender, EventArgs e)
{
~省略~
    //autoStartがtrueなら、URLプロパティを指定で自動再生
    axWindowsMediaPlayer1.URL = @"C:\Documents and Settings\All Users\Documentswmv";

    //悪い例です
    trackBar1.Maximum = (int)axWindowsMediaPlayer1.currentMedia.duration;
~省略~
}

上記のように再生開始直後に取得した場合、「’Value’ は ‘Minimum’ と ‘Maximum’ の間でなければなりません。」みたいなエラーが発生するかと思います。 ブレークポイントを挿入して、ローカルウィンドウから確認するとわかるように Maximumプロパティには、0が入っているかと思います。

ここで第3回の時に、OpenStateChangeイベントで、axWindowsMediaPlayerコントロールの状態を確認した時のことを思い出してください。 再生を開始した瞬間、バババッとステータスが変化していたかと思います。

再生を開始した瞬間ではロードが完了していないため、値が取得できていなかったわけですね。

では、メディアが開いた後に取得するようにすればいいということで、前回実装したOpenStateChangeイベントハンドラ内に 記述します。

1
2
3
4
5
6
7
8
9
10
11
12
private void axWindowsMediaPlayer1_OpenStateChange(object sender, OCXEvents_OpenStateChangeEvent e)
{
~省略~
    case 13:
            label2.Text = ("MediaOpen"); //メディアは現在開いています
            trackBar1.Maximum = )axWindowsMediaPlayer1.currentMedia.duration;
            break;
~省略~
    default:
            break;

}

これで、再生時間にあわせて、スライダーの位置が移動するようになりました~。

後は、スライダーを動かしてして再生位置を移動させればシークバーとして完成ですが、 これには、TrackBarのScrollイベントで、TrackBarのValueをCtlcontrols.currentPositionにセットしてあげればいいわけですね~。

フォームデザイナでTrackBarを選択し、Scrollイベントハンドラを生成します。

1
2
3
4
private void trackBar1_Scroll(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.Ctlcontrols.currentPosition = (double)trackBar1.Value;
}

これで、シークバーとしての機能が実装できました~。

マウス操作中の挙動を制御したいのであれば、TrackBarのMouseDownイベント、MouseUpイベントを使ってTimerを停止、開始を制御すれば ドラッグ中にスライダーが動いてしまうこともないでしょう~。

長くなりましたが、これで一旦「Windows Media Player ActiveX コントロール」をテーマにした記事を終了とします。

Comments