用C#做简易音乐播放器教程,未联网版本

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/neowtg/article/details/79387019

一、程序界面设计

1、左上角,添加两个label控件,lable1、2的text属性分别为“当前播放:”、“未播放”。

2、右上角添加一个buttom控件 ,text属性为“添加歌曲”。主要用于往下面歌曲列表添加本地歌曲。

3、groupBox(歌曲列表)内添加listBox控件,用于展示歌曲列表。

4、groupBox(播放进度)内添加trackBar控件,用于展示歌曲播放进度

5、groupBox(播放控制)内添加五个bottom控件,用来控制歌曲的播放,text属性如上图。

6、添加一个timer控件,后期用于检测歌曲播放进度以及控制滑块来控制歌曲播放进度。

7、添加windows自带的windowsMediaPlayer控件,可以用于播放音乐。

方法:右键工具箱面板空白处,点击选择项。


选择com,勾选windowsMediaPlayer添加到工具箱,再拖放到设计器中。



注:我再设计器中是将windowsMediaPlayer的尺寸改成(0,0)  ,所以并不会被看见。




二、代码编写

1、添加歌曲

双击添加歌曲按钮,为其注册点击事件

  private void button1_Click(object sender, EventArgs e)
        {//添加歌曲按钮

            OpenFileDialog open = new OpenFileDialog();     //实例化一个通用对话框
            open.Filter = "音频文件(*.mp3)|*.mp3";      //写一个文件过滤器
            if (open.ShowDialog() == DialogResult.OK)
            {
                axWindowsMediaPlayer1.URL = open.FileName;      //添加到播放器
                musicList.Items.Add(open.FileName);     //将音频文件添加到列表框内
                musicList.SelectedIndex = musicList.Items.Count - 1;    //选择添加的歌曲文件
                
            }

本部做完之后,按添加按钮添加mp3格式文件的歌曲可以发现歌曲名称和路径已经展示在listbox中。


2、播放进度

做播放进度的时候首先要声明一个方法来检测媒体播放进度。

首先声明几个变量。max标识歌曲的最大长度,min表示歌曲当前播放位置,bal表示歌曲播放百分比。


完成后,

选择timer1控件,按F4访问属性面板,属性中Interval改为1000,表示以秒为单位。

点击事件,为tick注册事件,代码如下:

        private void timer1_Tick(object sender, EventArgs e)
        {// 检测媒体的播放进度
            max = axWindowsMediaPlayer1.currentMedia.duration;//获取文件长度
            min = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;//获取文件的当前播放位置
            bal = min / max;//计算百分比
            trackBar1.Value = (int)(bal * 100);     //添加到滑块中去
        }

当然我们希望在把歌曲添加的时候,就已经把歌曲的长度检测出来,这时,我们回过头去修改一下"添加歌曲"代码。
  private void button1_Click(object sender, EventArgs e)
        {//添加歌曲按钮

            OpenFileDialog open = new OpenFileDialog();     //实例化一个通用对话框
            open.Filter = "音频文件(*.mp3)|*.mp3";      //写一个文件过滤器
            if (open.ShowDialog() == DialogResult.OK)
            {
                //还原最大值最小值进度条
                max = 0.0;
                min = 0.0;
                bal = 0.0;
                trackBar1.Value = 0;
                axWindowsMediaPlayer1.URL = open.FileName;      //添加到播放器
                musicList.Items.Add(open.FileName);     //将音频文件添加到列表框内
                musicList.SelectedIndex = musicList.Items.Count - 1;    //选择添加的歌曲文件
                timer1.Enabled = true;  //开始检测进度
            }


        }

这个时候,播放歌曲就已经可以看到滑块随着歌曲的播放进度变化而变化了。

下面就要考虑如何拖动滑块就可以直接控制音乐的播放进度。

首先为trackBar1注册MouseDown事件,用于按住滑块时停止滑块自我变化,暂停播放音乐文件。

        private void trackBar1_MouseDown(object sender, MouseEventArgs e)
        {
            timer1.Enabled = false;     //停止检测播放进度
            axWindowsMediaPlayer1.Ctlcontrols.pause();  //暂停播放文件
        }

然后再给trackBar1注册MouseUp事件,当鼠标松开后,按照新的位置开始播放。

        private void trackBar1_MouseUp(object sender, MouseEventArgs e)
        {//当滑块鼠标放下执行操作
            double newValue = trackBar1.Value * 0.1 * 0.1 * max;//还原播放进度
            axWindowsMediaPlayer1.Ctlcontrols.currentPosition = newValue;//重置播放进度
            axWindowsMediaPlayer1.Ctlcontrols.play();//按进度播放

        }

3、播放控制

控制播放的五个按钮分别注册事件,代码如下:

   private void btEnd_Click(object sender, EventArgs e)
        {
            //停止键
            axWindowsMediaPlayer1.Ctlcontrols.stop();

        }
        private void btStart_Click(object sender, EventArgs e)
        {
            //播放键
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
        private void btStop_Click(object sender, EventArgs e)
        {
            //暂停键
            axWindowsMediaPlayer1.Ctlcontrols.pause();
        }

按钮控制不够直接,我想在歌曲菜单中直接双击歌名来播放,如何实现?

选中listBox1为doubleClick注册事件,代码如下。

        private void musicList_DoubleClick(object sender, EventArgs e)
        {//歌曲列表,双击歌名执行代码
            if (musicList.SelectedIndex == -1)
            {
                axWindowsMediaPlayer1.URL = musicList.SelectedItem.ToString();
            }

        }

这个时候整个播放器已经可以基本运行了。

但是,在第二次打开的时候,第一次已经添加的歌曲并没有显示在listBox上,代码如下,仅供参考:

        //*****************************************将listBox的内容存入到本地,下次打开后自动读取**************************************************************************


        //以下代码执行时不报错,但是有时候会卡死。


        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //关闭窗口时的事件

            ////保存播放列表的歌曲
            //string save = "";
            //for (int i = 0; i < musicList.Items.Count; i++)
            //{
            //    save += musicList.Items.ToString() + "\t\n";
            //}
            ////实例化一个文件流
            //System.IO.FileStream fs = new System.IO.FileStream("C:\\Users\\Administrator\\Desktop\\temp.txt", System.IO.FileMode.Create, System.IO.FileAccess.Write);
            //System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, Encoding.Default);
            //sw.Write(save);     //写到文件
            //sw.Close();     //关闭文件流
            //fs.Close();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            ////载入窗体时执行
            //th1 = new Thread(new ThreadStart(r));
            //th1.IsBackground = true;
            //th1.Start();//开启线程

        }

        //private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
        //{

        //}
        //private delegate void readValue();//实例化一个委托对象

        //private void r()
        //{
        //    readValue rv = new readValue(read);
        //    this.Invoke(rv);    //调用委托对象
        //}
        //private void read()
        //{
        //    //实例化
        //    System.IO.FileStream fs=new System.IO.FileStream ("C:\\Users\\Administrator\\Desktop\\temp.txt",System.IO.FileMode.Open ,System.IO.FileAccess.Read );
        //    System.IO.StreamReader sr = new System.IO.StreamReader(fs, Encoding.Default);
        //    while (sr.EndOfStream  )
        //    {
        //        musicList.Items.Add(sr.ReadLine());//添加到列表框中
        //    }
        //    sr.Close();
        //    fs.Close();
        //    th1.Abort();    //关闭线程

        //}
    }
}












展开阅读全文

没有更多推荐了,返回首页