在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 音乐播放器 例子源码(UI简洁美观)

C# 音乐播放器 例子源码(UI简洁美观)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.53M
  • 下载次数:34
  • 浏览次数:656
  • 发布时间:2019-02-15
  • 实例类别:C#语言基础
  • 发 布 人:空珞
  • 文件格式:.zip
  • 所需积分:5

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

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();
        }

    }
}

实例下载地址

C# 音乐播放器 例子源码(UI简洁美观)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警