基于C#的音樂播放器主Form實現(xiàn)代碼
更新時間:2014年08月11日 15:59:45 投稿:shichen2014
這篇文章主要介紹了基于C#的音樂播放器主Form實現(xiàn)代碼,很實用的功能,需要的朋友可以參考下
本文所述為一個由C#編寫的音樂播放器的主Form代碼,里面有一些小技巧還是不錯的,現(xiàn)共享給大家參考一下。里面有播放器背景設置、線程定義、調(diào)用讀取文件目錄方法、播放時間計數(shù)器、設置LV背景、獲取播放歌曲、播放按鈕,切換播放or暫停、切換歌曲到下一首,調(diào)用切歌方法、顯示播放列表、歌詞局中、播放窗體最小化隱藏到托盤設置、進度條滾動模塊、從歌曲列表中刪除文件等等功能。且各個功能模板均備有較為詳細的注釋,便于大家閱讀理解。
程序主要代碼如下:
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 System.IO; using System.Drawing.Imaging; using System.Threading; namespace MyMusicBox { public partial class MainForm : Form { public MainForm() { InitializeComponent(); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); } Song mySong = null;//播放的歌曲對象 ListViewItem itemLrc;//打開歌詞路徑項 Bitmap bm ;//用于動態(tài)設置LV背景 public SavingInfo sa = null;//持久化信息類 Thread thread;//后臺線程 #region 加載事件 private void MainForm_Load(object sender, EventArgs e) { //調(diào)用讀取配置文件方法 Path.ReadPath(); //窗體背景設置為配置文件中的圖片 this.BackgroundImage = Image.FromFile(Path.bgPath); //調(diào)用讀取文件目錄方法 Path.ReadSong(); //讀取播放列表 sa = new SavingInfo(); sa.LoadPlayList(); //綁定LV BindAllLV(); BindPlayLV(); SetLV(); SetLrcBG(); timer1.Enabled = Path.Playing; //顯示時間 lblTime.Text = System.DateTime.Now.ToString(); //兩個lbl用來根據(jù)歌曲總長和播放長度顯示進度,設置位置重疊 lblRuning.Location = lblLong.Location; //啟動線程 thread = new Thread(Renovate); thread.IsBackground = true; thread.Start(); } #endregion #region 后臺刷新 /// <summary> /// 時間計數(shù)狀態(tài)等刷新 /// </summary> private void Renovate() { //while (true) //{ // //計數(shù) // Count(); // //獲取當前時間 // lblTime.Text = System.DateTime.Now.ToString(); // //無歌曲提示,如果播放列表為空且當前播放列表為顯示狀態(tài) // if (lvPlay.Items.Count == 0 && lvPlay.Visible) // lblTs.Visible = true; // else // lblTs.Visible = false; // Thread.Sleep(1000); //} } #endregion #region 設置LV背景 /// <summary> /// 設置LV背景 /// </summary> public void SetLV() { bm = new Bitmap(this.BackgroundImage, this.Width, this.Height); //繪制矩形,定義起始位置和寬高 Rectangle r = new Rectangle(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> private void GetSong() { //接收播放歌曲方法,獲得一個歌曲對象 this.mySong = PlayList.Play(); //如果歌曲對象不為空 if (mySong != null) { //播放器路徑設置為該歌曲路徑 wmp.URL = mySong.FileName; //調(diào)用方法,顯示歌曲名、歌手 lblName.Text = PlayList.GetName(); lblSinger.Text = PlayList.GetSinger(); mySong.SongState = SongPlayState.played;//修改播放狀態(tài) //播放按鈕圖片修改為暫停圖片 btnPlay.Image = Image.FromFile("Images\\stop.png"); try { //讀取歌詞路徑 Path.ReadLrc(); AddLrc(); //啟動一個定時器,此定時器只控制歌詞輪播 timer2.Start(); } catch (Exception) { LrcNull(); itemLrc = new ListViewItem(); itemLrc.SubItems.Add("找不到該歌曲歌詞文件!"); itemLrc.ForeColor = Color.Blue; itemLrc.Font = new Font("微軟雅黑", 14.25F, ((FontStyle)((FontStyle.Bold | FontStyle.Underline))), GraphicsUnit.Point, ((byte)(134))); lvLrc.Items.Add(itemLrc); } } } #endregion #region 主定時器 //定時器1 private void timer1_Tick(object sender, EventArgs e) { if (Path.songPath == "") { timer1.Enabled = false; return; } //如果當前無播放歌曲,調(diào)用獲取歌曲的方法 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); } // 切歌,當前有播放歌曲且播放狀態(tài)為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(); //獲取音量控件顯示值,根據(jù)控制刻度數(shù)量計算 this.trackBar1.Value = wmp.settings.volume / 10; //歌曲時間顯示,一個是總長度,一個是已播放長度,字符串類型 lblAll.Text = wmp.currentMedia.durationString; lblRun.Text = wmp.Ctlcontrols.currentPositionString; //進度條,使用了兩個lbl控件,歌曲長度/已播放長度=lbl1的寬/lbl2的寬 //乘1000為防止數(shù)據(jù)過小出現(xiàn)錯誤 double temp = (wmp.currentMedia.duration*1000) / (wmp.Ctlcontrols.currentPosition*1000); double width = lblLong.Width; double avg = width / temp; //判斷>1為了防止avg數(shù)值小于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> private void btnPlay_Click(object sender, EventArgs e) { 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(); } else if (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 切歌 //切換下一首,調(diào)用切歌方法 private void btnRight_Click(object sender, EventArgs e) { PlayList.Cut(false); } //上一首,調(diào)用切歌方法 private void btnLeft_Click(object sender, EventArgs e) { PlayList.Cut(true); } #endregion #region 音量 //靜音,靜音!=音量為0 private void btnModel_Click(object sender, EventArgs e) { //如果播放器非靜音狀態(tài),前景文字顯示紅叉,狀態(tài)改為靜音 if (wmp.settings.mute == false) { btnSound.Text = "×"; wmp.settings.mute = true; } else//反之,已是靜音狀態(tài),清空紅叉,設置非靜音狀態(tài) { btnSound.Text = ""; wmp.settings.mute = false; } } //設置音量,此事件為控制刻度值變化時 private void trackBar1_Scroll(object sender, EventArgs e) { //音量設置為控制刻度*10(因為初始化的時候是/10) wmp.settings.volume = this.trackBar1.Value * 10; } #endregion #region 歌曲列表操作 /// <summary> /// 綁定所有歌曲LV數(shù)據(jù) /// </summary> private void BindAllLV() { //如果所有歌曲集合為空,結束 if (PlayList.song == null) return; lvSong.Items.Clear(); //遍歷集合綁定到所有歌曲LV foreach (Song s in PlayList.song) { ListViewItem item = new ListViewItem(s.Name); item.Tag = s; item.SubItems.Add(s.Singer); lvSong.Items.Add(item); } } //點擊顯示所有歌曲 private void tslblAll_Click(object sender, EventArgs e) { //隱藏播放列表 lvPlay.Visible = false; //兩個LV位置重疊 lvSong.Location = lvPlay.Location; //點擊后改變背景色 tslblAll.BackColor = Color.Silver; tslblPlay.BackColor = Color.Transparent; //顯示所有歌曲LV lvSong.Visible = true; } //點擊顯示播放列表 private void tslblPlay_Click(object sender, EventArgs e) { //調(diào)用綁定播放LV數(shù)據(jù) BindPlayLV(); //背景色改變 tslblPlay.BackColor = Color.Silver; tslblAll.BackColor = Color.Transparent; //隱藏所有歌曲LV lvSong.Visible = false; //顯示播放LV lvPlay.Visible = true; } /// <summary> /// 綁定播放列表 /// </summary> private void BindPlayLV() { //如果播放集合不為空 if (PlayList.play!=null) { lvPlay.Items.Clear(); //遍歷集合綁定播放LV foreach (Song s in PlayList.play) { int id = lvPlay.Items.Count + 1; s.Id = id; ListViewItem item = new ListViewItem(id.ToString()); item.SubItems.Add(s.Name); item.Tag = s; lvPlay.Items.Add(item); } } } /// <summary> /// 歌曲計數(shù) /// </summary> private void Count() { //if (lvSong.Visible) // lblCount.Text = "已選" + lvSong.CheckedItems.Count + "\\總" + lvSong.Items.Count; //if (lvPlay.Visible) // lblCount.Text = "總" + lvPlay.Items.Count; } #endregion #region 歌詞操作 /// <summary> /// 設置歌詞背景 /// </summary> public void SetLrcBG() { bm = new Bitmap(this.BackgroundImage, this.Width, this.Height); //繪制矩形,定義起始位置和寬高 Rectangle r = new Rectangle(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(); } int nullCount;//記錄空行位置 /// <summary> /// 設置空行,使歌詞局中 /// </summary> private void LrcNull() { lvLrc.Items.Clear(); nullCount = (int)Math.Ceiling(Convert.ToDouble(lvLrc.Height / 30 / 2)); for (int i = 0; i <= nullCount; i++) { lvLrc.Items.Add(""); } } /// <summary> /// 添加歌詞 /// </summary> private void AddLrc() { LrcNull(); foreach (string key in Path.dicLrc.Keys) { ListViewItem item = new ListViewItem(); item.SubItems.Add(Path.dicLrc[key]); item.Tag = key; lvLrc.Items.Add(item); } } //只控制歌詞輪播 private void timer2_Tick(object sender, EventArgs e) { //調(diào)用顯示歌詞的方法 ShowLrc(); } /// <summary> /// 顯示歌詞 /// </summary> private void ShowLrc() { foreach (ListViewItem item in lvLrc.Items) { if (item.Tag == null) continue; if (item.Tag.ToString() == lblRun.Text ) { item.ForeColor = Color.DarkOrange; item.Font = new Font("華文琥珀", 16F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(134))); lvLrc.Items[item.Index -1].ForeColor = Color.Silver; lvLrc.Items[item.Index - 1].Font = new Font("微軟雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(134))); if (item.Index + 1<lvLrc.Items.Count) lvLrc.Items[item.Index+1].EnsureVisible(); } } } #endregion #region 窗體隱藏到托盤設置 //最小化到托盤 private void btnMix_Click(object sender, EventArgs e) { this.Hide(); } //主窗體大小狀態(tài)變化時 private void MainForm_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { //啟動一個控件,該控制可以讓程序在右下角顯示圖標,需要提前設置該控制顯示的圖標圖片 this.notifyIcon1.Visible = true; } } //托盤顯示,雙擊顯示窗體 private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { ShowMain(); } /// <summary> /// 顯示主窗體 /// </summary> public void ShowMain() { if (!this.Visible) { this.TopMost = true; this.Show(); this.TopMost = false; } else { this.TopMost = true; this.TopMost = false; } } //托盤打開窗體 private void tsmiShow_Click(object sender, EventArgs e) { ShowMain(); } //托盤退出 private void tsmiExit_Click(object sender, EventArgs e) { Application.Exit(); } #endregion #region 窗體位移 Point mouseOff;//鼠標移動位置變量 bool leftFlag;//標記是否為左鍵 private void pnlMain_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseOff = new Point(-e.X, -e.Y); //得到變量的值 leftFlag = true; //點擊左鍵按下時標注為true; } } private void pnlMain_MouseMove(object sender, MouseEventArgs e) { if (leftFlag) { Point mouseSet = Control.MousePosition; mouseSet.Offset(mouseOff.X, mouseOff.Y); //設置移動后的位置 Location = mouseSet; } } private void pnlMain_MouseUp(object sender, MouseEventArgs e) { if (leftFlag) { leftFlag = false;//釋放鼠標后標注為false; } } #endregion #region 進度條滾動塊移動 int runX;//記錄滾動塊初始位置 private void picRun_MouseDown(object sender, MouseEventArgs e) { runX = e.X; } //釋放鼠標位移,進度前進 private void picRun_MouseUp(object sender, MouseEventArgs e) { 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; double temp = (lblLong.Width*1000.0 )/ (lblRuning.Width*1000.0); wmp.Ctlcontrols.currentPosition = wmp.currentMedia.duration / temp; } } #endregion #region 歌曲增刪操作 //添加歌曲到播放列表 private void tsmiAdd_Click(object sender, EventArgs e) { if (lvSong.CheckedItems.Count > 0) { foreach (ListViewItem item in lvSong.CheckedItems) { // 遍歷播放集合,如果存在不添加 foreach (Song s in PlayList.play) { if (s.Name == item.Text) { PlayList.play.Remove(s); break; } } PlayList.play.Add(item.Tag as Song); } } } //所有歌曲:刪除選中歌曲 private void tsmiDel_Click(object sender, EventArgs e) { foreach (ListViewItem item in lvSong.Items) { if (item.Checked) { PlayList.song.Remove(item.Tag as Song); } } BindAllLV(); } //全選歌曲 private void tsmiCheck_Click(object sender, EventArgs e) { foreach (ListViewItem item in lvSong.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 = "全部選中"; } } } //選中項的同時選中復選框 private void lvSong_MouseDown(object sender, MouseEventArgs e) { if (lvSong.SelectedItems.Count > 0 && e.Button == MouseButtons.Left) { lvSong.SelectedItems[0].Checked = true; } } //播放列表刪除事件 private void tsmiPlayDel_Click(object sender, EventArgs e) { foreach (ListViewItem item in lvPlay.Items) { if (item.Selected) { //PlayList.id = (lvPlay.Items[item.Index+1].Tag as Song).Id; //this.song = null; PlayList.play.Remove(item.Tag as Song); } } BindPlayLV(); } //清空播放列表 private void tsmiPlayClear_Click(object sender, EventArgs e) { PlayList.play.Clear(); this.mySong = null; BindPlayLV(); } //從播放列表刪除文件 private void tsmiPlayDelFile_Click(object sender, EventArgs e) { if (lvPlay.SelectedItems.Count > 0) { DelFile(lvPlay.SelectedItems[0]); } } /// <summary> /// 刪除某項對應文件 /// </summary> /// <param name="item"></param> private void DelFile(ListViewItem item) { try { string path = (item.Tag as Song).FileName; File.Delete(path); BindAllLV(); BindPlayLV(); } catch (Exception) { MessageBox.Show("該文件為只讀文件或用戶權限不夠,無法刪除!"); } } //從所有歌曲中刪除文件 private void tsmiDelFile_Click(object sender, EventArgs e) { if (lvSong.SelectedItems.Count > 0) { DelFile(lvSong.SelectedItems[0]); } } //雙擊列表項播放歌曲 private void lvPlay_DoubleClick(object sender, EventArgs e) { if (!timer1.Enabled) { PlayList.id = (lvPlay.SelectedItems[0].Tag as Song).Id; timer1.Start(); } if (lvPlay.SelectedItems.Count > 0) { PlayList.id = (lvPlay.SelectedItems[0].Tag as Song).Id; this.mySong = null; } } #endregion #region 設置 //跳轉設置窗體 private void btnSet_Click(object sender, EventArgs e) { SetForm set = new SetForm(); set.parent = this;//把主窗體傳過去 set.Show(this); } #endregion #region 回滾 /// <summary> /// 路徑重置后 /// </summary> public void Back() { BindAllLV(); PlayList.Update(); timer1.Start(); } #endregion #region 退出 //關閉時保存列表 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (Path.SaveList) sa.SavePlayList(); } //面板退出 private void btnExit_Click(object sender, EventArgs e) { if (Path.Exit) { Application.Exit(); } else { this.Hide(); } } #endregion #region 背景顏色等變換控制 private void btnLeft_MouseEnter(object sender, EventArgs e) { ((Button)sender).BackgroundImage = Image.FromFile("Images//allbtn_highlight.png"); } private void btnLeft_MouseLeave(object sender, EventArgs e) { ((Button)sender).BackgroundImage = null; } private void tslblPlay_MouseEnter(object sender, EventArgs e) { ((ToolStripLabel)sender).BackgroundImage = Image.FromFile("Images//Album_bkg_wubian.png"); } private void tslblPlay_MouseLeave(object sender, EventArgs e) { ((ToolStripLabel)sender).BackgroundImage = null; } //選中改變顏色 private void lvSong_ItemChecked(object sender, ItemCheckedEventArgs e) { foreach (ListViewItem item in lvSong.Items) { if (item.Checked) { item.ForeColor = Color.DarkOrange; } else { item.ForeColor = Color.DimGray; } } } /// <summary> /// 當前播放歌曲改變顏色 /// </summary> private void SongColor() { foreach (ListViewItem item in lvPlay.Items) { if (item.SubItems[1].Text == lblName.Text) { item.ForeColor = Color.DeepSkyBlue; } else { item.ForeColor = Color.White; } } } #endregion #region 選擇歌詞 private void lvLrc_MouseDown(object sender, MouseEventArgs e) { if (lvLrc.SelectedItems.Count>0&&lvLrc.SelectedItems[0] == itemLrc) { if (Path.OpenLrc()) { AddLrc(); //啟動一個定時器,此定時器只控制歌詞輪播 timer2.Start(); } } } #endregion #region 窗體最大化設置 Size now;//原始尺寸 Point pN;//原始位置 //最大化 private void btnMax_Click(object sender, EventArgs e) { Size max = new Size(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切換 private void tsmiLrc_Click(object sender, EventArgs e) { lvLrc.Visible = true; wmp.Visible = false; tsmiLrc.BackColor = Color.LawnGreen; tsmiMv.BackColor = Color.Transparent; } private void tsmiMv_Click(object sender, EventArgs e) { 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> private void PlayModel() { if (tsmiOne.Checked) { PlayList.PlayOne(); } else if (tsmiSJ.Checked) { PlayList.PlayRandom(); } } private void tsmiXH_Click(object sender, EventArgs e) { ToolStripMenuItem ts=((ToolStripMenuItem)sender); foreach(ToolStripMenuItem item in tsmiModel.DropDownItems) { if (ts.Checked && ts == item) { continue; } else { item.Checked = false; } } } #endregion } }
希望本文所述示例對大家的C#程序開發(fā)能夠起到一定的借鑒價值。
相關文章
淺析JAVA中過濾器、監(jiān)聽器、攔截器的區(qū)別
本文通過代碼分析和文字說明的方式給大家淺析JAVA中過濾器、監(jiān)聽器、攔截器的區(qū)別,感興趣的朋友一起看下吧2015-09-09