基本信息
源码名称:C# 音乐播放器 例子源码(UI简洁美观)
源码大小:0.53M
文件格式:.zip
开发语言:C#
更新时间:2019-02-15
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 5 元 
   源码介绍

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace MusicPlayer
{
    /// <summary>
    /// 播放顺序枚举
    /// </summary>
    public enum PlayOrder
    {
        order, //顺序播放
        random, //随机播放
        unique, //单曲循环
        list //列表循环
    }
    public partial class FrmMain : Form
    {
        private List<Music> musicList;//歌曲列表
        int curI = -1;//当前播放的歌曲索引
        PlayOrder playOrder;//播放顺序

        public FrmMain()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 进度条 - 鼠标单击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void progressBar_MouseClick(object sender, MouseEventArgs e)
        {
            if (wmp.playState == WMPLib.WMPPlayState.wmppsStopped || wmp.playState == WMPLib.WMPPlayState.wmppsUndefined) return;
            double curPo = (double)(e.X) / (double)(pbProgressBar.Width) * wmp.currentMedia.duration;
            wmp.Ctlcontrols.currentPosition = curPo;
            pbProgressBar.Value = (int)curPo;
        }
        /// <summary>
        /// 窗体加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Load(object sender, EventArgs e)
        {
            LoadMusicList();
            wmp.settings.autoStart = false;
            timer1.Enabled = true;
            pbRewind.BackgroundImage = ilImages.Images["rewind.png"];
            pbForward.BackgroundImage = ilImages.Images["forward.png"];
            pbPlayOrPause.BackgroundImage = ilImages.Images["play.png"];
            pbPlayOrPause.Tag = "play";
            wmp.settings.volume = 100;
            tbVolume.Value = wmp.settings.volume;

            // ASF, MPEG-1, MPEG-2, WAV, AVI, MIDI, VOD, AU, MP3
            ofd.Filter = "MP3|*.MP3|ASF|*.ASF|MPEG-1|*.MPEG-1|MPEG-2|*.MPEG-2|WAV|*.WAV|AVI|*.AVI|MIDI|*.MIDI|VOD|*.VOD|所以文件|*.*";
            playOrder = PlayOrder.order;
            tsmiOrderPlay.Checked = true;
        }
        /// <summary>
        /// 加载歌曲列表
        /// </summary>
        private void LoadMusicList()
        {
            if (File.Exists("Config/MusicList.bin"))
            {
                FileStream fs = new FileStream("Config/MusicList.bin", FileMode.Open, FileAccess.Read);
                BinaryFormatter bf = new BinaryFormatter();
                musicList = (List<Music>)bf.Deserialize(fs);
                fs.Close();
                foreach (Music music in musicList)
                {
                    lvMusicList.Items.Add(music.Name);
                }
            }
            else
            {
                musicList = new List<Music>();
                DirectoryInfo di = new DirectoryInfo("Config");
                if (!di.Exists) di.Create();
            }
        }
        /// <summary>
        /// 保存歌曲列表
        /// </summary>
        private void SaveMusicList()
        {
            FileStream fs = new FileStream("Config/MusicList.bin", FileMode.Create, FileAccess.Write);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, musicList);
            fs.Close();
        }
        /// <summary>
        /// 菜单 - 添加歌曲文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiAddMusicFile_Click(object sender, EventArgs e)
        {
            DialogResult result = ofd.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                for (int i = 0; i < ofd.FileNames.Count(); i  )
                {
                    string name = ofd.SafeFileNames[i].Substring(0, ofd.SafeFileNames[i].LastIndexOf('.'));
                    string path = ofd.FileNames[i];
                    musicList.Add(new Music(name,path));
                    ListViewItem item = new ListViewItem(name);
                    lvMusicList.Items.Add(item);
                }
                SaveMusicList();
            }
        }
        /// <summary>
        /// 双击歌曲列表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lvMusicList_DoubleClick(object sender, EventArgs e)
        {
            if (lvMusicList.SelectedItems.Count == 0) return;
            if(curI > -1) lvMusicList.Items[curI].BackColor = Color.White;
            curI = lvMusicList.SelectedIndices[0];
            lvMusicList.SelectedItems[0].BackColor = Color.Yellow;
            Play(musicList[curI]);
        }
        /// <summary>
        /// 播放
        /// </summary>
        /// <param name="path"></param>
        private void Play(Music music)
        {
            if (File.Exists(music.Path))
            {
                wmp.URL = music.Path;
                wmp.Ctlcontrols.play();
                pbPlayOrPause.BackgroundImage = ilImages.Images["pause.png"];
                pbPlayOrPause.Tag = "pause";
                this.Text = "音乐播放器 - "   musicList[curI].Name;
            }
            else
            {
                lvMusicList.Items.RemoveAt(curI);
                musicList.Remove(music);
                if (curI < musicList.Count)
                {
                    Play(musicList[curI]);
                    lvMusicList.Items[curI].BackColor = Color.Yellow;
                }
            }
        }
        /// <summary>
        /// 上一首
        /// </summary>
        private void Pgup()
        {
            if (musicList.Count == 0 || curI == -1) return;
            if (playOrder == PlayOrder.random)
            {
                RandomPlay();
                return;
            }
            lvMusicList.Items[curI].BackColor = Color.White;
            curI--;
            if (curI < 0) curI = musicList.Count - 1;
            Play(musicList[curI]);
            lvMusicList.Items[curI].BackColor = Color.Yellow;
            this.Text = "音乐播放器 - "   musicList[curI].Name;
        }
        /// <summary>
        /// 下一首
        /// </summary>
        private void Pgdn()
        {
            if (musicList.Count == 0 || curI == -1) return;
            if (playOrder == PlayOrder.random)
            {
                RandomPlay();
                return;
            }
            lvMusicList.Items[curI].BackColor = Color.White;
            curI  ;
            if (curI >= musicList.Count) curI = 0;
            Play(musicList[curI]);
            lvMusicList.Items[curI].BackColor = Color.Yellow;
            this.Text = "音乐播放器 - "   musicList[curI].Name;
        }
        /// <summary>
        /// 停止
        /// </summary>
        private void Stop()
        {
            this.Text = "音乐播放器 - 小伍软件";
            wmp.Ctlcontrols.stop();
            pbProgressBar.Value = 0;
            lblCurValue.Text = "0:0";
            lblMaxValue.Text = "0:0";
            pbPlayOrPause.BackgroundImage = ilImages.Images["play.png"];
            pbPlayOrPause.Tag = "play";
            if(lvMusicList.Items.Count > 0 && curI > -1)lvMusicList.Items[curI].BackColor = Color.White;
            curI = -1;
        }
        /// <summary>
        /// 随机播放
        /// </summary>
        private void RandomPlay()
        {
            lvMusicList.Items[curI].BackColor = Color.White;
            Random random = new Random();
            curI = random.Next(musicList.Count);
            Play(musicList[curI]);
            lvMusicList.Items[curI].BackColor = Color.Yellow;
        }
        /// <summary>
        /// 时钟事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            //当前歌曲播放结束
            if (wmp.playState == WMPLib.WMPPlayState.wmppsStopped && curI >= 0)
            {
                if (playOrder == PlayOrder.order)//顺序播放
                {
                    if (curI < musicList.Count - 1)
                    {
                        Pgdn();
                    }
                    else
                    {
                        Stop();
                    }
                }
                else if (playOrder == PlayOrder.list)//列表循环
                {
                    Pgdn();
                }
                else if (playOrder == PlayOrder.random)//随机播放
                {
                    RandomPlay();
                }
                else if(playOrder == PlayOrder.unique)//单曲循环
                {
                    wmp.Ctlcontrols.play();
                }
            }
            //正在播放
            if (wmp.playState == WMPLib.WMPPlayState.wmppsPlaying)
            {
                int duration = (int)wmp.currentMedia.duration;
                if (duration > 0)
                {
                    pbProgressBar.Maximum = (int)wmp.currentMedia.duration;
                    lblMaxValue.Text = wmp.currentMedia.durationString;
                }
                lblCurValue.Text = wmp.Ctlcontrols.currentPositionString;
                pbProgressBar.Value = (int)wmp.Ctlcontrols.currentPosition;
            }
        }

        private void pbRewind_MouseMove(object sender, MouseEventArgs e)
        {
            pbRewind.BackgroundImage = ilImages.Images["rewind on.png"];
        }

        private void pbRewind_MouseLeave(object sender, EventArgs e)
        {
            pbRewind.BackgroundImage = ilImages.Images["rewind.png"];
        }

        private void pbPlayOrPause_MouseMove(object sender, MouseEventArgs e)
        {
            if (pbPlayOrPause.Tag.Equals("play"))
            {
                pbPlayOrPause.BackgroundImage = ilImages.Images["play on.png"];
            }
            else
            {
                pbPlayOrPause.BackgroundImage = ilImages.Images["pause on.png"];
            }
        }

        private void pbPlayOrPause_MouseLeave(object sender, EventArgs e)
        {
            if (pbPlayOrPause.Tag.Equals("play"))
            {
                pbPlayOrPause.BackgroundImage = ilImages.Images["play.png"];
            }
            else
            {
                pbPlayOrPause.BackgroundImage = ilImages.Images["pause.png"];
            }
        }

        private void pbForward_MouseMove(object sender, MouseEventArgs e)
        {
            pbForward.BackgroundImage = ilImages.Images["forward on.png"];
        }

        private void pbForward_MouseLeave(object sender, EventArgs e)
        {
            pbForward.BackgroundImage = ilImages.Images["forward.png"];
        }
        /// <summary>
        /// 单击播放or暂停
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pbPlayOrPause_Click(object sender, EventArgs e)
        {
            if (wmp.playState == WMPLib.WMPPlayState.wmppsPlaying)
            {
                wmp.Ctlcontrols.pause();
                pbPlayOrPause.BackgroundImage = ilImages.Images["play.png"];
                pbPlayOrPause.Tag = "play";
            }
            else if(wmp.playState == WMPLib.WMPPlayState.wmppsPaused)
            {
                wmp.Ctlcontrols.play();
                pbPlayOrPause.BackgroundImage = ilImages.Images["pause.png"];
                pbPlayOrPause.Tag = "pause";
            }
            else if (wmp.playState == WMPLib.WMPPlayState.wmppsStopped || wmp.playState == WMPLib.WMPPlayState.wmppsUndefined)
            {
                lvMusicList_DoubleClick(sender, e);
            }
            
        }
        /// <summary>
        /// 图片按钮 - 上一首
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pbRewind_Click(object sender, EventArgs e)
        {
            Pgup();
        }
        /// <summary>
        /// 图片按钮 - 下一首
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pbForward_Click(object sender, EventArgs e)
        {
            Pgdn();
        }

        private void tbVolume_Scroll(object sender, EventArgs e)
        {
            wmp.settings.volume = tbVolume.Value;
        }
        /// <summary>
        /// 菜单 - 添加歌曲文件夹
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiAddMusicDir_Click(object sender, EventArgs e)
        {
            DialogResult result = fbd.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                DirectoryInfo di = new DirectoryInfo(fbd.SelectedPath);
                FileInfo[] files = di.GetFiles();
                string filter = ".ASF, .MPEG-1, .MPEG-2, .WAV, .AVI, .MIDI, .VOD, .AU, .MP3";
                foreach (FileInfo file in files)
                {
                    //ASF, MPEG-1, MPEG-2, WAV, AVI, MIDI, VOD, AU, MP3
                    if (filter.IndexOf(file.Extension) >= 0 || filter.IndexOf(file.Extension.ToUpper()) >= 0)
                    {
                        string name = file.Name.Substring(0, file.Name.LastIndexOf('.'));
                        musicList.Add(new Music(name,file.FullName));
                        lvMusicList.Items.Add(name);
                    }
                }
                SaveMusicList();
            }
        }
        /// <summary>
        /// 右键菜单 - 播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiPlay_Click(object sender, EventArgs e)
        {
            lvMusicList_DoubleClick(sender, e);
        }
        /// <summary>
        /// 右键菜单 - 移除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiRemove_Click(object sender, EventArgs e)
        {
            if (lvMusicList.SelectedItems.Count == 0) return;
            DialogResult result = MessageBox.Show("确定要移除选中的项吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
            if (result == System.Windows.Forms.DialogResult.Cancel) return;
            int count = lvMusicList.SelectedIndices.Count;//选中的项目数
            musicList.RemoveRange(lvMusicList.SelectedIndices[0], count);
            if (curI > -1 && lvMusicList.SelectedIndices.Contains(curI)) Stop();//当选中的项目包含正在播放的歌曲时,要停止播放
            if (curI > lvMusicList.SelectedIndices[count - 1]) curI -= count;//当curI > 选中项目中的最后一项的索引时,curI要减count
            
            foreach (ListViewItem item in lvMusicList.SelectedItems)
            {
                lvMusicList.Items.Remove(item);
            }
            SaveMusicList();
            
        }
        /// <summary>
        /// 右键菜单 - 顺序播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiOrderPlay_Click(object sender, EventArgs e)
        {
            playOrder = PlayOrder.order;
            tsmiOrderPlay.Checked = true;
            tsmiRandomPlay.Checked = false;
            tsmiOnePlay.Checked = false;
            tsmiListPlay.Checked = false;
        }
        /// <summary>
        /// 右键菜单 - 随机播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiRandomPlay_Click(object sender, EventArgs e)
        {
            playOrder = PlayOrder.random;
            tsmiOrderPlay.Checked = false;
            tsmiRandomPlay.Checked = true;
            tsmiOnePlay.Checked = false;
            tsmiListPlay.Checked = false;
        }
        /// <summary>
        /// 右键菜单 - 单曲循环
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiOnePlay_Click(object sender, EventArgs e)
        {
            playOrder = PlayOrder.unique;
            tsmiOrderPlay.Checked = false;
            tsmiRandomPlay.Checked = false;
            tsmiOnePlay.Checked = true;
            tsmiListPlay.Checked = false;
        }
        /// <summary>
        /// 右键菜单 - 列表循环
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiListPlay_Click(object sender, EventArgs e)
        {
            playOrder = PlayOrder.list;
            tsmiOrderPlay.Checked = false;
            tsmiRandomPlay.Checked = false;
            tsmiOnePlay.Checked = false;
            tsmiListPlay.Checked = true;
        }
        /// <summary>
        /// 歌曲列表 - 释放某键
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lvMusicList_KeyUp(object sender, KeyEventArgs e)
        {
            if (lvMusicList.SelectedItems.Count == 0) return;
            if (e.KeyCode == Keys.Delete)
            {
                tsmiRemove_Click(sender,e);
            }
        }
        /// <summary>
        /// 右键菜单 - 清空列表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiClearList_Click(object sender, EventArgs e)
        {
            if (lvMusicList.Items.Count == 0) return;
            DialogResult result = MessageBox.Show("确定要清空播放列表吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (result == System.Windows.Forms.DialogResult.Cancel) return;
            Stop();
            lvMusicList.Items.Clear();
            musicList.Clear();
            SaveMusicList();
        }
        /// <summary>
        /// 菜单 - 关于
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiAbout_Click(object sender, EventArgs e)
        {
            FrmAbout fa = new FrmAbout();
            fa.ShowDialog();
        }

    }
}