日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#/音乐播放器/带进度条/歌词滚动、颜色变化/桌面应用程序设计

發布時間:2024/1/8 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#/音乐播放器/带进度条/歌词滚动、颜色变化/桌面应用程序设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用基本C#知識實現制作一個音樂播放器

前言

寫這個博客并不是說我的作品多么高級或完美,只是希望能在一些功能方面給你們一些啟發,能幫助到你們做出真正好的程序,這就足夠了
話不多說,讓我們開始吧~~~

截圖示意

總體思路

首先呢,選擇這種無邊框窗口,我們會發現移動窗口成了問題,所以呢,就需要特意對主窗口寫事件,即按下時,移動時,松開時等各是怎樣,這個應該不難。

···

Point downpoint;Point movepoint;bool ismoving;//實現鼠標控制窗口移動private void Form1_MouseDown(object sender, MouseEventArgs e){downpoint = e.Location;ismoving = true;}private void timermove_Tick(object sender, EventArgs e){}//實現鼠標控制窗口移動(2)private void mainForm_MouseMove(object sender, MouseEventArgs e){if (ismoving == true){movepoint = e.Location;this.Location = new Point(this.Location.X + (movepoint.X - downpoint.X),this.Location.Y + (movepoint.Y - downpoint.Y));}}//鼠標按鍵抬起窗口停止移動private void mainForm_MouseUp(object sender, MouseEventArgs e){ismoving = false;}

····

然后就是引入WindowsMediaPlayer后我們需要實現音頻文件資源的打開,這里我設置了文件過濾器,只能打開“.MP3”“.MP4”“.flac”三種文件,同時實現了基本功能,例如點擊播放器的播放(暫停)鍵時圖標的變化、歌曲繼續、暫停等(所以我們用到一個bool型變量方便判斷)

···

bool isplaying = true;string a;//歌曲總時間(字符串)//點擊播放:加載歌詞private void start_Click(object sender, EventArgs e){if (tick == 0){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "mp3音樂|*.mp3|mp4音樂|*.mp4|flac文件|*.flac";//設置文件過濾,使之只能打開.mp3/.mp4/flac三種格式的音頻文件ofd.ShowDialog();string fileName = ofd.FileName;media.URL = fileName;media.Ctlcontrols.play();// start_Click(object sender, EventArgs e);timer2.Enabled = true;}tick = 1;timer1.Enabled = true;Encoding encode = Encoding.GetEncoding("GB2312");FileStream fs = new FileStream("陳一發兒-童話鎮.lrc", FileMode.Open);StreamReader sr = new StreamReader(fs, encode);string s = sr.ReadLine();//int xPos = 100;int yPos = 50;string a= media.currentMedia.durationString;stime.Text = a;while (s != null){s = sr.ReadLine();if(s==null){break;}if (s.Equals("")){continue;}Lyric1 lyric =new Lyric1();lyric.minute =int.Parse(s.Substring(1,2));lyric.second = int.Parse(s.Substring(4,2));lyric.lyrics = s.Substring(10);lyric.tosecond = lyric.minute * 60 + lyric.second;//if(s.Substring(10)==null)//{// lyric.sminute = Convert.ToInt32(s.Substring(1, 1));//lyric.ssecond = Convert.ToInt32(s.Substring(5, 1));// }listLyric1.Add(lyric);yPos += 30;} if (isplaying){start.BackgroundImage = Properties.Resources.play_circle_o;isplaying = false;media.Ctlcontrols.pause();timer1.Enabled = false;}else{start.BackgroundImage = Properties.Resources.pause_circle_o;isplaying = true;media.Ctlcontrols.play();timer1.Enabled = true;}fs.Close();sr.Close();}

···

另一個功能有一部分也包含在上述代碼中,那就是重要的歌詞繪制(只不過上面主要只實現了歌詞文件(“.lrc”)的讀取),其實有人說用label也能顯示歌詞、甚至實現歌詞滾動、變色,可是吧…效果不太好,一方面不流暢,另一方面顯示效果也差,甚至可能有閃屏
所以我采用了GDI+繪圖實現的
注意哈,GDI+繪圖是不會自動變化的,需要窗口隱藏以至于無效化才會更新
所以我們需要寫程序使需要的區域(不一定是整個主窗口)不斷自動刷新

···

Graphics g;//繪圖對象int PointY=140;int current;//主窗口繪制歌詞private void mainForm_Paint(object sender, PaintEventArgs e){g = e.Graphics;if (tick == 2){for (int i = 0; i < listLyric.Count; i++){if (i == current)g.DrawString(listLyric[i].lyrics, new Font("微軟雅黑", 17), Brushes.LightBlue, 400, PointY + i * 50);elseg.DrawString(listLyric[i].lyrics, new Font("微軟雅黑", 14), Brushes.White, 400, PointY + i * 50);}}else{for (int i = 0; i < listLyric1.Count; i++){if (i == current)g.DrawString(listLyric1[i].lyrics, new Font("微軟雅黑", 17), Brushes.LightBlue, 400, PointY + i * 50);elseg.DrawString(listLyric1[i].lyrics, new Font("微軟雅黑", 14), Brushes.White, 400, PointY + i * 50);}}}double position;//時鐘:不停調用刷新主窗口private void timer1_Tick(object sender, EventArgs e){//獲取當前歌曲播放時間position = media.Ctlcontrols.currentPosition;int a = (int)position;int m = a / 60;int s = a % 60;time1.Text = m.ToString();time2.Text = s.ToString();PointY-=1;for (int i = 0; i < listLyric.Count-1; i++){double b = listLyric[i].tosecond;double c = listLyric[i+1].tosecond;// int positioni = (int)position;if (position > b && position < c)current = i;}this.Invalidate(UpdateRect);}Rectangle UpdateRect;//主窗口刷新private void mainForm_Load(object sender, EventArgs e){UpdateRect = new Rectangle(0, 0, this.ClientSize.Width,this.ClientSize.Height - panel1.Height);}

···

還有一個功能是包含在上面代碼里的
那就是歌曲總時間與現在時間的顯示,這個的話現在時間直接讀取來的時間通常是以秒為單位,我們為了顯示更加直觀,將其換算為正常的分與秒,總時間就采取直接顯示原來的字符串形式

···

position = media.Ctlcontrols.currentPosition;int a = (int)position;int m = a / 60;int s = a % 60;time1.Text = m.ToString();time2.Text = s.ToString();string a = media.currentMedia.durationString;stime.Text = a;

···

最后呢就是進度條怎么來的
這個我用了兩個panel,不同的寬度,不同的顏色,通過在timer里調用增加藍色panel的長度實現,這個我們要用到音頻文件總時間,從而計算出單位timer時間里長度伸展多少,來實現進度條的功能

····

private void timer2_Tick(object sender, EventArgs e){a = media.currentMedia.durationString;int timm = int.Parse(a.Substring(1,1));int tims = int.Parse(a.Substring(3,2));int tim = timm * 60 + tims;sizex += (610/ tim);if(sizex<610&& isplaying==true){going.Size = new Size(sizex, 10);}}

···

總體就這樣啦,不過,很多地方可能都沒說明,例如我是額外封裝了一個類 Lyric1的、還多寫了一個打開歌曲的通道,以及用tick判斷打開形式;上面涉及到的當前歌詞變大變色也沒詳細說明… … 代碼貼在下面,大家自己讀好了

代碼

···

//Lyric1.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace kuwo { class Lyric1 {public int minute;public int second;public int tosecond;public string lyrics;}}//Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace kuwo { public partial class mainForm : Form {List<Lyric1> listLyric = new List<Lyric1>();List<Lyric1> listLyric1 = new List<Lyric1>();int tick = 0;public mainForm(){InitializeComponent();}Point downpoint;Point movepoint;bool ismoving;//實現鼠標控制窗口移動(1)private void Form1_MouseDown(object sender, MouseEventArgs e){downpoint = e.Location;ismoving = true;}private void timermove_Tick(object sender, EventArgs e){}//實現鼠標控制窗口移動(2)private void mainForm_MouseMove(object sender, MouseEventArgs e){if (ismoving == true){movepoint = e.Location;this.Location = new Point(this.Location.X + (movepoint.X - downpoint.X),this.Location.Y + (movepoint.Y - downpoint.Y));}}//鼠標按鍵抬起窗口停止移動private void mainForm_MouseUp(object sender, MouseEventArgs e){ismoving = false;}bool isplaying = true;string a;//歌曲總時間(字符串)//點擊播放:加載歌詞private void start_Click(object sender, EventArgs e){if (tick == 0){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "mp3音樂|*.mp3|mp4音樂|*.mp4|flac文件|*.flac";//設置文件過濾,使之只能打開.mp3/.mp4/flac三種格式的音頻文件ofd.ShowDialog();string fileName = ofd.FileName;media.URL = fileName;media.Ctlcontrols.play();// start_Click(object sender, EventArgs e);timer2.Enabled = true;}tick = 1;timer1.Enabled = true;Encoding encode = Encoding.GetEncoding("GB2312");FileStream fs = new FileStream("陳一發兒-童話鎮.lrc", FileMode.Open);StreamReader sr = new StreamReader(fs, encode);string s = sr.ReadLine();//int xPos = 100;int yPos = 50;string a= media.currentMedia.durationString;stime.Text = a;while (s != null){s = sr.ReadLine();if(s==null){break;}if (s.Equals("")){continue;}Lyric1 lyric =new Lyric1();lyric.minute =int.Parse(s.Substring(1,2));lyric.second = int.Parse(s.Substring(4,2));lyric.lyrics = s.Substring(10);lyric.tosecond = lyric.minute * 60 + lyric.second;//if(s.Substring(10)==null)//{// lyric.sminute = Convert.ToInt32(s.Substring(1, 1));//lyric.ssecond = Convert.ToInt32(s.Substring(5, 1));// }listLyric1.Add(lyric);yPos += 30;} if (isplaying){start.BackgroundImage = Properties.Resources.play_circle_o;isplaying = false;media.Ctlcontrols.pause();timer1.Enabled = false;//"C#openfiledialog 設置文件過濾"}else{start.BackgroundImage = Properties.Resources.pause_circle_o;isplaying = true;media.Ctlcontrols.play();timer1.Enabled = true;}fs.Close();sr.Close();}//打開本地資源private void startplay_Click(object sender, EventArgs e){tick = 2;OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "mp3音樂|*.mp3|mp4音樂|*.mp4|flac文件|*.flac";//設置文件過濾,使之只能打開.mp3/.mp4/flac三種格式的音頻文件ofd.ShowDialog();string fileName = ofd.FileName;media.URL = fileName;media.Ctlcontrols.play();// start_Click(object sender, EventArgs e);timer2.Enabled = true;timer1.Enabled = true;Encoding encode = Encoding.GetEncoding("GB2312");FileStream fs = new FileStream("陳一發兒-童話鎮.lrc", FileMode.Open);StreamReader sr = new StreamReader(fs, encode);string s = sr.ReadLine();// int xPos = 100;int yPos = 50;string a = media.currentMedia.durationString;stime.Text = a;while (s != null){s = sr.ReadLine();if (s == null){break;}if (s.Equals("")){continue;}Lyric1 lyric = new Lyric1();lyric.minute = int.Parse(s.Substring(1, 2));lyric.second = int.Parse(s.Substring(4, 2));lyric.lyrics = s.Substring(10);lyric.tosecond = lyric.minute * 60 + lyric.second;//if(s.Substring(10)==null)//{// lyric.sminute = Convert.ToInt32(s.Substring(1, 1));//lyric.ssecond = Convert.ToInt32(s.Substring(5, 1));// }listLyric.Add(lyric);yPos += 30;}fs.Close();sr.Close();}//繪畫Graphics g;//繪圖對象int PointY=140;int current;//主窗口繪制歌詞private void mainForm_Paint(object sender, PaintEventArgs e){g = e.Graphics;if (tick == 2){for (int i = 0; i < listLyric.Count; i++){if (i == current)g.DrawString(listLyric[i].lyrics, new Font("微軟雅黑", 17), Brushes.LightBlue, 400, PointY + i * 50);elseg.DrawString(listLyric[i].lyrics, new Font("微軟雅黑", 14), Brushes.White, 400, PointY + i * 50);}}else{for (int i = 0; i < listLyric1.Count; i++){if (i == current)g.DrawString(listLyric1[i].lyrics, new Font("微軟雅黑", 17), Brushes.LightBlue, 400, PointY + i * 50);elseg.DrawString(listLyric1[i].lyrics, new Font("微軟雅黑", 14), Brushes.White, 400, PointY + i * 50);}}}double position;//時鐘:不停調用刷新主窗口private void timer1_Tick(object sender, EventArgs e){//獲取當前歌曲播放時間position = media.Ctlcontrols.currentPosition;int a = (int)position;int m = a / 60;int s = a % 60;time1.Text = m.ToString();time2.Text = s.ToString();PointY-=1;for (int i = 0; i < listLyric.Count-1; i++){double b = listLyric[i].tosecond;double c = listLyric[i+1].tosecond;// int positioni = (int)position;if (position > b && position < c)current = i;}this.Invalidate(UpdateRect);}Rectangle UpdateRect;//主窗口刷新private void mainForm_Load(object sender, EventArgs e){UpdateRect = new Rectangle(0, 0, this.ClientSize.Width,this.ClientSize.Height - panel1.Height);}int sizex = 42;private void timer2_Tick(object sender, EventArgs e){a = media.currentMedia.durationString;int timm = int.Parse(a.Substring(1,1));int tims = int.Parse(a.Substring(3,2));int tim = timm * 60 + tims;sizex += (610/ tim);if(sizex<610&& isplaying==true){going.Size = new Size(sizex, 10);}}//點擊播放private void lyricstart_Click(object sender, EventArgs e){// tick = 1;if (timer1.Enabled == true)timer1.Enabled = false;elsetimer1.Enabled = true;} } }

···

總結

以上是生活随笔為你收集整理的C#/音乐播放器/带进度条/歌词滚动、颜色变化/桌面应用程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产爽爽爽 | 韩国电影一区二区三区 | 国产精品粉嫩 | 福利小视频在线播放 | 欧美日韩国产在线观看 | 青青在线免费观看 | 香蕉视频成人在线 | 一区中文字幕 | 青青草国产成人av片免费 | 亚洲一区日韩精品 | 午夜激情亚洲 | 亚洲精品视频在线 | 色七七桃花综合影院 | 91色拍 | 国产三级中文字幕 | 欧美日韩一区二区三区四区五区 | 国产少妇自拍 | 美女爱爱视频 | 久久久全国免费视频 | 第一页在线视频 | 亚洲先锋影音 | 日本免费精品视频 | 催眠调教后宫乱淫校园 | 黄色污污网站 | 深夜免费福利 | 美女黄色在线观看 | 五月婷婷综合在线 | 91视频看 | av在线一区二区 | 香蕉色视频 | 成人综合婷婷国产精品久久 | 蜜臀av首页 | 久久免费福利视频 | 久久美女免费视频 | 一色屋免费视频 | 国产精品久久久久永久免费看 | 日韩一区二区三区高清 | 日韩二区三区 | a∨鲁丝一区鲁丝二区鲁丝三区 | 激情春色网| 欧美日韩国产一区二区三区 | 一区二区三区四区av | 黑料视频在线观看 | 国产日韩一级 | 国产亚洲精品久久久久久久久动漫 | 亚洲黄视频 | 亚洲五十路| 激情五月av | 天堂√在线 | 中文字幕无线精品亚洲乱码一区 | 荫道bbwbbb高潮潮喷 | av小说在线观看 | 999国产精品亚洲77777 | 国产色无码精品视频国产 | 日韩精品免费一区二区在线观看 | 国产精品久久久久不卡 | 中文字幕在线观看日韩 | 中文字幕亚洲区 | 麻豆视频91 | 亚洲最新网址 | 欧美日韩二区三区 | www.一区二区| 91精品小视频 | 欧美久久久久久久 | 国产免费黄色小视频 | 日本成人精品视频 | 可以直接看的无码av | 污污视频免费网站 | 亚洲日批| 欧美日韩在线观看一区二区三区 | 日韩欧美福利视频 | 国产午夜福利视频在线观看 | 亚洲精品福利视频 | 国产三级午夜理伦三级 | 国产高清视频免费在线观看 | 初音未来打屁股 | 亚洲奶水xxxx哺乳期 | 在线观看免费黄视频 | 超碰综合在线 | 久久噜噜| 久久天堂| 激情视频一区二区 | 鲁鲁狠狠狠7777一区二区 | 中文字幕丝袜诱惑 | av导航在线 | 欧美成人免费在线视频 | 久久天| 羞羞涩涩网站 | 欧洲成人综合 | 尤物视频在线观看免费 | 亚洲一区二区三区视频 | 91在线精品李宗瑞 | 91手机视频在线观看 | 成年人av在线播放 | 蜜桃精品在线观看 | 久久不卡视频 | 天天综合网国产 | heyzo亚洲 | 亚洲国产爱 |