媒体播放器中的进度条和播放列表

时间:2011-04-25 21:43:53

标签: c#

如何为媒体播放器创建进度条和播放列表?我正在用C#制作自己的媒体播放器。

以下是播放文件的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuartzTypeLib;
using System.Runtime.InteropServices;

namespace trying
{
public partial class Form1 : Form
{
    [DllImport("winmm.dll")]
    public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);

    [DllImport("winmm.dll")]
    public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);

    public Form1()
    {
        InitializeComponent();
    }
    // Define constants used for specifying the window style.
    private const int WS_CHILD = 0x40000000;
    private const int WS_CLIPCHILDREN = 0x2000000;
    // Hold a form-level reference to the media control interface,
    // so the code can control playback of the currently loaded
    // movie.
    public IMediaControl  mc =null;
    public IMediaPosition m=null;
    // Hold a form-level reference to the video window in case it
    // needs to be resized.
    public IVideoWindow videoWindow = null;
    public int a;

    private void button1_Click(object sender, EventArgs e)
    {
        if (mc != null)
        {
            mc.Run();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        mc.Stop();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        mc.Pause();
    }

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        //Calculate the volume that's being set
     int NewVolume = ((ushort.MaxValue / 10) * trackBar1.Value);
     // Set the same volume for both the left and the right channels
     uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16));
     // Set the volume
     waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);
    }

    private void newFileToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // Allow the user to choose a file.
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter =
        "Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|" +
        "All Files|*.*";
        if (DialogResult.OK == openFileDialog.ShowDialog())
        {
            // Stop the playback for the current movie, if it exists.
            if (mc != null) mc.Stop();
            // Load the movie file.
            FilgraphManager graphManager = new FilgraphManager();
            graphManager.RenderFile(openFileDialog.FileName);
            // Attach the view to a picture box on the form.
            try
            {
                videoWindow = (IVideoWindow)graphManager;
                videoWindow.Owner = (int)pictureBox1.Handle;
                videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
                videoWindow.SetWindowPosition(
                pictureBox1.ClientRectangle.Left,
                pictureBox1.ClientRectangle.Top,
                pictureBox1.ClientRectangle.Width,
                pictureBox1.ClientRectangle.Height);
            }
            catch
            {
                // An error can occur if the file does not have a video
                // source (for example, an MP3 file).
                // You can ignore this error and still allow playback to
                // continue (without any visualization).
            }

            // Start the playback (asynchronously).
            mc = (IMediaControl)graphManager;
            mc.Run();
        }
    }

我想要这个工作

this.progressBar2.Value =(int) m.CurrentPosition;

但它不起作用。

2 个答案:

答案 0 :(得分:2)

m.CurrentPosition是一个double,progressBar1.Value是一个int。要施展它

this.progressBar1.Value = (int)m.CurrentPosition

但是,这会截断你的double,使其成为一个int。

答案 1 :(得分:1)

如果您想显示当前位置,则需要this.progressBar1.Value = (int)m.CurrentPosition;