基于C#的音乐播放器主Form实现代码
本文所述为一个由C#编写的音乐播放器的主Form代码,里面有一些小技巧还是不错的,现共享给大家参考一下。里面有播放器背景设置、线程定义、调用读取文件目录方法、播放时间计数器、设置LV背景、获取播放歌曲、播放按钮,切换播放or暂停、切换歌曲到下一首,调用切歌方法、显示播放列表、歌词局中、播放窗体最小化隐藏到托盘设置、进度条滚动模块、从歌曲列表中删除文件等等功能。且各个功能模板均备有较为详细的注释,便于大家阅读理解。
程序主要代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.IO; usingSystem.Drawing.Imaging; usingSystem.Threading; namespaceMyMusicBox { publicpartialclassMainForm:Form { publicMainForm() { InitializeComponent(); SetStyle(ControlStyles.UserPaint,true); SetStyle(ControlStyles.OptimizedDoubleBuffer,true); SetStyle(ControlStyles.AllPaintingInWmPaint,true); SetStyle(ControlStyles.DoubleBuffer,true); } SongmySong=null;//播放的歌曲对象 ListViewItemitemLrc;//打开歌词路径项 Bitmapbm;//用于动态设置LV背景 publicSavingInfosa=null;//持久化信息类 Threadthread;//后台线程 #region加载事件 privatevoidMainForm_Load(objectsender,EventArgse) { //调用读取配置文件方法 Path.ReadPath(); //窗体背景设置为配置文件中的图片 this.BackgroundImage=Image.FromFile(Path.bgPath); //调用读取文件目录方法 Path.ReadSong(); //读取播放列表 sa=newSavingInfo(); sa.LoadPlayList(); //绑定LV BindAllLV(); BindPlayLV(); SetLV(); SetLrcBG(); timer1.Enabled=Path.Playing; //显示时间 lblTime.Text=System.DateTime.Now.ToString(); //两个lbl用来根据歌曲总长和播放长度显示进度,设置位置重叠 lblRuning.Location=lblLong.Location; //启动线程 thread=newThread(Renovate); thread.IsBackground=true; thread.Start(); } #endregion #region后台刷新 ///<summary> ///时间计数状态等刷新 ///</summary> privatevoidRenovate() { //while(true) //{ ////计数 //Count(); ////获取当前时间 //lblTime.Text=System.DateTime.Now.ToString(); ////无歌曲提示,如果播放列表为空且当前播放列表为显示状态 //if(lvPlay.Items.Count==0&&lvPlay.Visible) //lblTs.Visible=true; //else //lblTs.Visible=false; //Thread.Sleep(1000); //} } #endregion #region设置LV背景 ///<summary> ///设置LV背景 ///</summary> publicvoidSetLV() { bm=newBitmap(this.BackgroundImage,this.Width,this.Height); //绘制矩形,定义起始位置和宽高 Rectangler=newRectangle(lvPlay.Location.X,lvPlay.Location.Y,lvPlay.Width,lvSong.Height); //按矩形尺寸和起始位置截取bm的一部分 bm=bm.Clone(r,bm.PixelFormat); //把截取到的图片设置为lv背景,达到与主窗体背景完美契合的效果 lvSong.BeginUpdate(); lvSong.BackgroundImage=(Image)bm; lvSong.EndUpdate(); lvPlay.BeginUpdate(); lvPlay.BackgroundImage=(Image)bm; lvPlay.EndUpdate(); } #endregion #region获取歌曲 ///<summary> ///获取播放歌曲 ///</summary> privatevoidGetSong() { //接收播放歌曲方法,获得一个歌曲对象 this.mySong=PlayList.Play(); //如果歌曲对象不为空 if(mySong!=null) { //播放器路径设置为该歌曲路径 wmp.URL=mySong.FileName; //调用方法,显示歌曲名、歌手 lblName.Text=PlayList.GetName(); lblSinger.Text=PlayList.GetSinger(); mySong.SongState=SongPlayState.played;//修改播放状态 //播放按钮图片修改为暂停图片 btnPlay.Image=Image.FromFile("Images\\stop.png"); try { //读取歌词路径 Path.ReadLrc(); AddLrc(); //启动一个定时器,此定时器只控制歌词轮播 timer2.Start(); } catch(Exception) { LrcNull(); itemLrc=newListViewItem(); itemLrc.SubItems.Add("找不到该歌曲歌词文件!"); itemLrc.ForeColor=Color.Blue; itemLrc.Font=newFont("微软雅黑",14.25F,((FontStyle)((FontStyle.Bold|FontStyle.Underline))),GraphicsUnit.Point,((byte)(134))); lvLrc.Items.Add(itemLrc); } } } #endregion #region主定时器 //定时器1 privatevoidtimer1_Tick(objectsender,EventArgse) { if(Path.songPath=="") { timer1.Enabled=false; return; } //如果当前无播放歌曲,调用获取歌曲的方法 if(this.mySong==null) { GetSong(); } //自动下一首,如果当前播放完毕 if(this.wmp.playState==WMPLib.WMPPlayState.wmppsStopped) { this.mySong=null;//将歌曲设为空 Path.lrcPath=""; Path.dicLrc.Clear(); PlayModel(); PlayList.PlayNext(); Thread.Sleep(1000); } //切歌,当前有播放歌曲且播放状态为cut if(this.mySong!=null&&this.mySong.SongState==SongPlayState.cut) { this.wmp.URL="";//置空 timer2.Stop(); Path.dicLrc.Clear(); Path.lrcPath=""; this.mySong=null; } //如果当前有播放歌曲,需要获取的一些属性 if(wmp.URL!="") { //设置当前播放歌曲颜色 SongColor(); //获取音量控件显示值,根据控制刻度数量计算 this.trackBar1.Value=wmp.settings.volume/10; //歌曲时间显示,一个是总长度,一个是已播放长度,字符串类型 lblAll.Text=wmp.currentMedia.durationString; lblRun.Text=wmp.Ctlcontrols.currentPositionString; //进度条,使用了两个lbl控件,歌曲长度/已播放长度=lbl1的宽/lbl2的宽 //乘1000为防止数据过小出现错误 doubletemp=(wmp.currentMedia.duration*1000)/(wmp.Ctlcontrols.currentPosition*1000); doublewidth=lblLong.Width; doubleavg=width/temp; //判断>1为了防止avg数值小于int界限 if(avg>1) lblRuning.Width=Convert.ToInt32(avg); picRun.Left=lblRuning.Right; //托盘显示播放歌曲 this.notifyIcon1.Text=lblName.Text+lblSinger.Text; } } #endregion #region播放按钮 ///<summary> ///播放按钮,切换播放or暂停 ///</summary> privatevoidbtnPlay_Click(objectsender,EventArgse) { if(!timer1.Enabled) timer1.Start(); //如果当前为正在播放 if(wmp.playState==WMPLib.WMPPlayState.wmppsPlaying) { //暂停播放 wmp.Ctlcontrols.pause(); //按钮图片修改为播放 btnPlay.Image=Image.FromFile("Images\\play.png"); //停止控制歌词滚动的定时器 if(timer2.Enabled) timer2.Stop(); } elseif(wmp.playState==WMPLib.WMPPlayState.wmppsPaused) { //开始播放 wmp.Ctlcontrols.play(); //按钮图片修改为暂停 btnPlay.Image=Image.FromFile("Images\\stop.png"); //启动歌词滚动 if(!timer2.Enabled&&Path.dicLrc.Count>0) timer2.Start(); } } #endregion #region切歌 //切换下一首,调用切歌方法 privatevoidbtnRight_Click(objectsender,EventArgse) { PlayList.Cut(false); } //上一首,调用切歌方法 privatevoidbtnLeft_Click(objectsender,EventArgse) { PlayList.Cut(true); } #endregion #region音量 //静音,静音!=音量为0 privatevoidbtnModel_Click(objectsender,EventArgse) { //如果播放器非静音状态,前景文字显示红叉,状态改为静音 if(wmp.settings.mute==false) { btnSound.Text="×"; wmp.settings.mute=true; } else//反之,已是静音状态,清空红叉,设置非静音状态 { btnSound.Text=""; wmp.settings.mute=false; } } //设置音量,此事件为控制刻度值变化时 privatevoidtrackBar1_Scroll(objectsender,EventArgse) { //音量设置为控制刻度*10(因为初始化的时候是/10) wmp.settings.volume=this.trackBar1.Value*10; } #endregion #region歌曲列表操作 ///<summary> ///绑定所有歌曲LV数据 ///</summary> privatevoidBindAllLV() { //如果所有歌曲集合为空,结束 if(PlayList.song==null) return; lvSong.Items.Clear(); //遍历集合绑定到所有歌曲LV foreach(SongsinPlayList.song) { ListViewItemitem=newListViewItem(s.Name); item.Tag=s; item.SubItems.Add(s.Singer); lvSong.Items.Add(item); } } //点击显示所有歌曲 privatevoidtslblAll_Click(objectsender,EventArgse) { //隐藏播放列表 lvPlay.Visible=false; //两个LV位置重叠 lvSong.Location=lvPlay.Location; //点击后改变背景色 tslblAll.BackColor=Color.Silver; tslblPlay.BackColor=Color.Transparent; //显示所有歌曲LV lvSong.Visible=true; } //点击显示播放列表 privatevoidtslblPlay_Click(objectsender,EventArgse) { //调用绑定播放LV数据 BindPlayLV(); //背景色改变 tslblPlay.BackColor=Color.Silver; tslblAll.BackColor=Color.Transparent; //隐藏所有歌曲LV lvSong.Visible=false; //显示播放LV lvPlay.Visible=true; } ///<summary> ///绑定播放列表 ///</summary> privatevoidBindPlayLV() { //如果播放集合不为空 if(PlayList.play!=null) { lvPlay.Items.Clear(); //遍历集合绑定播放LV foreach(SongsinPlayList.play) { intid=lvPlay.Items.Count+1; s.Id=id; ListViewItemitem=newListViewItem(id.ToString()); item.SubItems.Add(s.Name); item.Tag=s; lvPlay.Items.Add(item); } } } ///<summary> ///歌曲计数 ///</summary> privatevoidCount() { //if(lvSong.Visible) //lblCount.Text="已选"+lvSong.CheckedItems.Count+"\\总"+lvSong.Items.Count; //if(lvPlay.Visible) //lblCount.Text="总"+lvPlay.Items.Count; } #endregion #region歌词操作 ///<summary> ///设置歌词背景 ///</summary> publicvoidSetLrcBG() { bm=newBitmap(this.BackgroundImage,this.Width,this.Height); //绘制矩形,定义起始位置和宽高 Rectangler=newRectangle(lvLrc.Location.X,lvLrc.Location.Y,lvLrc.Width,lvLrc.Height); //按矩形尺寸和起始位置截取bm的一部分 bm=bm.Clone(r,PixelFormat.Undefined); //把截取到的图片设置为lv背景,达到与主窗体背景完美契合的效果 lvLrc.BeginUpdate(); lvLrc.BackgroundImage=(Image)bm; lvLrc.EndUpdate(); } intnullCount;//记录空行位置 ///<summary> ///设置空行,使歌词局中 ///</summary> privatevoidLrcNull() { lvLrc.Items.Clear(); nullCount=(int)Math.Ceiling(Convert.ToDouble(lvLrc.Height/30/2)); for(inti=0;i<=nullCount;i++) { lvLrc.Items.Add(""); } } ///<summary> ///添加歌词 ///</summary> privatevoidAddLrc() { LrcNull(); foreach(stringkeyinPath.dicLrc.Keys) { ListViewItemitem=newListViewItem(); item.SubItems.Add(Path.dicLrc[key]); item.Tag=key; lvLrc.Items.Add(item); } } //只控制歌词轮播 privatevoidtimer2_Tick(objectsender,EventArgse) { //调用显示歌词的方法 ShowLrc(); } ///<summary> ///显示歌词 ///</summary> privatevoidShowLrc() { foreach(ListViewItemiteminlvLrc.Items) { if(item.Tag==null) continue; if(item.Tag.ToString()==lblRun.Text) { item.ForeColor=Color.DarkOrange; item.Font=newFont("华文琥珀",16F,FontStyle.Regular,GraphicsUnit.Point,((byte)(134))); lvLrc.Items[item.Index-1].ForeColor=Color.Silver; lvLrc.Items[item.Index-1].Font=newFont("微软雅黑",12F,FontStyle.Regular,GraphicsUnit.Point,((byte)(134))); if(item.Index+1<lvLrc.Items.Count) lvLrc.Items[item.Index+1].EnsureVisible(); } } } #endregion #region窗体隐藏到托盘设置 //最小化到托盘 privatevoidbtnMix_Click(objectsender,EventArgse) { this.Hide(); } //主窗体大小状态变化时 privatevoidMainForm_SizeChanged(objectsender,EventArgse) { if(this.WindowState==FormWindowState.Minimized) { //启动一个控件,该控制可以让程序在右下角显示图标,需要提前设置该控制显示的图标图片 this.notifyIcon1.Visible=true; } } //托盘显示,双击显示窗体 privatevoidnotifyIcon1_MouseDoubleClick(objectsender,MouseEventArgse) { ShowMain(); } ///<summary> ///显示主窗体 ///</summary> publicvoidShowMain() { if(!this.Visible) { this.TopMost=true; this.Show(); this.TopMost=false; } else { this.TopMost=true; this.TopMost=false; } } //托盘打开窗体 privatevoidtsmiShow_Click(objectsender,EventArgse) { ShowMain(); } //托盘退出 privatevoidtsmiExit_Click(objectsender,EventArgse) { Application.Exit(); } #endregion #region窗体位移 PointmouseOff;//鼠标移动位置变量 boolleftFlag;//标记是否为左键 privatevoidpnlMain_MouseDown(objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { mouseOff=newPoint(-e.X,-e.Y);//得到变量的值 leftFlag=true;//点击左键按下时标注为true; } } privatevoidpnlMain_MouseMove(objectsender,MouseEventArgse) { if(leftFlag) { PointmouseSet=Control.MousePosition; mouseSet.Offset(mouseOff.X,mouseOff.Y);//设置移动后的位置 Location=mouseSet; } } privatevoidpnlMain_MouseUp(objectsender,MouseEventArgse) { if(leftFlag) { leftFlag=false;//释放鼠标后标注为false; } } #endregion #region进度条滚动块移动 intrunX;//记录滚动块初始位置 privatevoidpicRun_MouseDown(objectsender,MouseEventArgse) { runX=e.X; } //释放鼠标位移,进度前进 privatevoidpicRun_MouseUp(objectsender,MouseEventArgse) { picRun.Left+=e.X-runX-picRun.Width/2; if(picRun.Left>lblLong.Right) picRun.Left=lblLong.Right; if(picRun.Left<lblLong.Left) picRun.Left=lblLong.Left; if(mySong!=null) { lblRuning.Width=picRun.Right-lblRuning.Left; doubletemp=(lblLong.Width*1000.0)/(lblRuning.Width*1000.0); wmp.Ctlcontrols.currentPosition=wmp.currentMedia.duration/temp; } } #endregion #region歌曲增删操作 //添加歌曲到播放列表 privatevoidtsmiAdd_Click(objectsender,EventArgse) { if(lvSong.CheckedItems.Count>0) { foreach(ListViewItemiteminlvSong.CheckedItems) { //遍历播放集合,如果存在不添加 foreach(SongsinPlayList.play) { if(s.Name==item.Text) { PlayList.play.Remove(s); break; } } PlayList.play.Add(item.TagasSong); } } } //所有歌曲:删除选中歌曲 privatevoidtsmiDel_Click(objectsender,EventArgse) { foreach(ListViewItemiteminlvSong.Items) { if(item.Checked) { PlayList.song.Remove(item.TagasSong); } } BindAllLV(); } //全选歌曲 privatevoidtsmiCheck_Click(objectsender,EventArgse) { foreach(ListViewItemiteminlvSong.Items) { if(tsmiCheck.Text=="全部选中") { item.Checked=true; if(item.Index+1==lvSong.Items.Count) tsmiCheck.Text="取消选中"; } else { item.Checked=false; if(item.Index+1==lvSong.Items.Count) tsmiCheck.Text="全部选中"; } } } //选中项的同时选中复选框 privatevoidlvSong_MouseDown(objectsender,MouseEventArgse) { if(lvSong.SelectedItems.Count>0&&e.Button==MouseButtons.Left) { lvSong.SelectedItems[0].Checked=true; } } //播放列表删除事件 privatevoidtsmiPlayDel_Click(objectsender,EventArgse) { foreach(ListViewItemiteminlvPlay.Items) { if(item.Selected) { //PlayList.id=(lvPlay.Items[item.Index+1].TagasSong).Id; //this.song=null; PlayList.play.Remove(item.TagasSong); } } BindPlayLV(); } //清空播放列表 privatevoidtsmiPlayClear_Click(objectsender,EventArgse) { PlayList.play.Clear(); this.mySong=null; BindPlayLV(); } //从播放列表删除文件 privatevoidtsmiPlayDelFile_Click(objectsender,EventArgse) { if(lvPlay.SelectedItems.Count>0) { DelFile(lvPlay.SelectedItems[0]); } } ///<summary> ///删除某项对应文件 ///</summary> ///<paramname="item"></param> privatevoidDelFile(ListViewItemitem) { try { stringpath=(item.TagasSong).FileName; File.Delete(path); BindAllLV(); BindPlayLV(); } catch(Exception) { MessageBox.Show("该文件为只读文件或用户权限不够,无法删除!"); } } //从所有歌曲中删除文件 privatevoidtsmiDelFile_Click(objectsender,EventArgse) { if(lvSong.SelectedItems.Count>0) { DelFile(lvSong.SelectedItems[0]); } } //双击列表项播放歌曲 privatevoidlvPlay_DoubleClick(objectsender,EventArgse) { if(!timer1.Enabled) { PlayList.id=(lvPlay.SelectedItems[0].TagasSong).Id; timer1.Start(); } if(lvPlay.SelectedItems.Count>0) { PlayList.id=(lvPlay.SelectedItems[0].TagasSong).Id; this.mySong=null; } } #endregion #region设置 //跳转设置窗体 privatevoidbtnSet_Click(objectsender,EventArgse) { SetFormset=newSetForm(); set.parent=this;//把主窗体传过去 set.Show(this); } #endregion #region回滚 ///<summary> ///路径重置后 ///</summary> publicvoidBack() { BindAllLV(); PlayList.Update(); timer1.Start(); } #endregion #region退出 //关闭时保存列表 privatevoidMainForm_FormClosing(objectsender,FormClosingEventArgse) { if(Path.SaveList) sa.SavePlayList(); } //面板退出 privatevoidbtnExit_Click(objectsender,EventArgse) { if(Path.Exit) { Application.Exit(); } else { this.Hide(); } } #endregion #region背景颜色等变换控制 privatevoidbtnLeft_MouseEnter(objectsender,EventArgse) { ((Button)sender).BackgroundImage=Image.FromFile("Images//allbtn_highlight.png"); } privatevoidbtnLeft_MouseLeave(objectsender,EventArgse) { ((Button)sender).BackgroundImage=null; } privatevoidtslblPlay_MouseEnter(objectsender,EventArgse) { ((ToolStripLabel)sender).BackgroundImage=Image.FromFile("Images//Album_bkg_wubian.png"); } privatevoidtslblPlay_MouseLeave(objectsender,EventArgse) { ((ToolStripLabel)sender).BackgroundImage=null; } //选中改变颜色 privatevoidlvSong_ItemChecked(objectsender,ItemCheckedEventArgse) { foreach(ListViewItemiteminlvSong.Items) { if(item.Checked) { item.ForeColor=Color.DarkOrange; } else { item.ForeColor=Color.DimGray; } } } ///<summary> ///当前播放歌曲改变颜色 ///</summary> privatevoidSongColor() { foreach(ListViewItemiteminlvPlay.Items) { if(item.SubItems[1].Text==lblName.Text) { item.ForeColor=Color.DeepSkyBlue; } else { item.ForeColor=Color.White; } } } #endregion #region选择歌词 privatevoidlvLrc_MouseDown(objectsender,MouseEventArgse) { if(lvLrc.SelectedItems.Count>0&&lvLrc.SelectedItems[0]==itemLrc) { if(Path.OpenLrc()) { AddLrc(); //启动一个定时器,此定时器只控制歌词轮播 timer2.Start(); } } } #endregion #region窗体最大化设置 Sizenow;//原始尺寸 PointpN;//原始位置 //最大化 privatevoidbtnMax_Click(objectsender,EventArgse) { Sizemax=newSize(Screen.PrimaryScreen.WorkingArea.Width-10,Screen.PrimaryScreen.WorkingArea.Height-20); if(this.Size!=max) { pN=this.Location; now=this.Size; this.Size=max; this.Left=5; this.Top=5; btnMax.Image=Image.FromFile("Images//max1.png") ; } else { this.Location=pN; this.Size=now; btnMax.Image=Image.FromFile("Images//max.png"); } SetLV(); SetLrcBG(); } #endregion #region歌词、MV切换 privatevoidtsmiLrc_Click(objectsender,EventArgse) { lvLrc.Visible=true; wmp.Visible=false; tsmiLrc.BackColor=Color.LawnGreen; tsmiMv.BackColor=Color.Transparent; } privatevoidtsmiMv_Click(objectsender,EventArgse) { wmp.Location=lvLrc.Location; wmp.Size=lvLrc.Size; lvLrc.Visible=false; wmp.Visible=true; tsmiLrc.BackColor=Color.Transparent; tsmiMv.BackColor=Color.LawnGreen; } #endregion #region播放模式切换 ///<summary> ///播放模式 ///</summary> privatevoidPlayModel() { if(tsmiOne.Checked) { PlayList.PlayOne(); } elseif(tsmiSJ.Checked) { PlayList.PlayRandom(); } } privatevoidtsmiXH_Click(objectsender,EventArgse) { ToolStripMenuItemts=((ToolStripMenuItem)sender); foreach(ToolStripMenuItemitemintsmiModel.DropDownItems) { if(ts.Checked&&ts==item) { continue; } else { item.Checked=false; } } } #endregion } }
希望本文所述示例对大家的C#程序开发能够起到一定的借鉴价值。