在这学期的桌面应用设计课上,老师带领我们做了一个模仿酷狗音乐盒的音乐播放器,虽然最终的播放器做得比较粗糙,但基本的播放功能和歌词滚动功能都实现,并将项目打包成Windows安装程序,废话不多说,下面来看一下它的实现过程吧。


 

  • 新建窗体项目

打开Visual Studio 点击 “文件-新建-项目-Visual C#项目-windows窗体应用”,将项目新建到合适的位置,本人建议将同一语言的项目都保存在一个文件夹中。

  • 添加WindowsMediaPlayer组件

 本次项目为了简便起见,使用了C#的WindowsMeidaPlayer组件来进行歌曲的播放,该组件的添加方式为Visual Studio中点击”工具-选择工具箱项-COM组件-找到WindowMediaPlayer组件”然后点击确定,WindowMediaPlayer组件就添加到项目中了。

  • 向窗体添加axWindowsMediaPlayer控件

 在添加完WindowsMediaPlayer组件后,工具箱控件栏就会多出一个WindowsMediaPlayer控件,我们将他拖动到Form窗体上便实现了播放器的添加.(若没有工具箱界面的请点击”视图-工具箱”或者直接Ctrl+Alt+X就能调出工具箱界面)

  • 界面设计

界面设计一直都是软件开发比较头疼的问题,读者可以参照酷狗音乐盒的真实界面来进行模仿,也可以在它的基础上进行创新,界面设计我是这么做的,在form的底部添加一个Panel控件,将其颜色设为半透明,然后再在上面添加播放、上一曲、下一曲、进度条、循环模式、音量调节、歌曲列表按钮(不要拖button按钮,拖picturebox,再去图标网站上下载各式图标设置picturebox的图片,button太丑了),其他的读者可以在此基础上进行创新,争取把界面设计的更出色。

  • 播放歌曲

有了axWindowsMediaPlayer之后,我们就可以播放歌曲了,具体方式为将axWindowsMediaPlayer对象的URL设置为你要打开的音乐文件,我们在Form类中新建一个play方法,表示播放歌曲,代码如下:

 1 //播放歌曲
 2         public bool play(String filename)
 3         {
 4                 if (File.Exists(filename))
 5                 {
 6                     //mediaplayer播放
 7                     axplayer.URL = filename;//播放歌曲
 8                 SongInfoLbl lbl = (SongInfoLbl)pnl_songlist.Controls[Index];
 9                 lbl.setisplay();
10                 Set_SongList_isplay(lbl);
11                 if (!LoadLyric(filename))//载入歌词
12                     {
13                         lbl_LyricState.Text = "  当前暂无歌词\n点击添加歌词文件";
14                     }
15                     else
16                     {
17                         lbl_LyricState.Text = "";
18                         for (int i = 0; i < lyricfile.Lyric_List.Count; i++)
19                         {
20                             initpostion.Add(i * 30 + 150);
21                             postion.Add(i * 30 + 150);
22                         }
23                     }
24                     return true;
25                 }
26                 else
27                 {
28                     return false;//文件打开失败则播放错误
29                 }
30         }
  • 载入歌词

 前面的play方法中有一个调用方法LoadLyric(filename),该方法就是用来载入歌词的,因为作为一个播放器,如果只能播放歌曲而不能显示歌词的话那就太单调了,因此我们添加了载入歌词的功能,但歌词文件的载入比较麻烦,在查看了歌词文件后,我们可以发现歌词文件都是以”[时间点]歌词内容”的形式来一行一行地储存的,那么我们就可以用FileStream来对歌词文件进行读取并提取出里面的时间点、歌词内容等,基础类型并不能保存这么多的信息,因此我们需要新建一个类Lyric,用该类就可以保存每行歌词的信息了。

歌词文件的特征:

Lyric类

1 class Lyric//用于保存歌词信息
2     {
3         public int minute;//分钟
4         public float second;//
5         public String strLyric;//具体歌词
6         public float totsecond;//总秒数
7     }

光有Lyric类还不够,因为歌词文件中的歌词不可能只有一行,

因此我们需要一个列表来保存歌词文件,我们为了方便将其抽象成LyricFile类,用于保存歌词文件的全部信息

 

 1 //歌词文件
 2     class LyricFile//用于保存歌词文件信息
 3     {
 4         //数据
 5        public List<Lyric> Lyric_List= new List<Lyric>();//歌词列表
 6         //方法
 7         public bool LoadLyricFromFile(string filename)//从文件载入歌词
 8         {
 9             if (File.Exists(filename))
10             {
11                 //从文件载入歌词
12                 Encoding encoder = Encoding.GetEncoding("GB2312");
13                 FileStream fs = new FileStream(filename, FileMode.Open);
14                 StreamReader sr = new StreamReader(fs, encoder);
15 
16 
17                 String strlyric;//保存歌词
18                 while ((strlyric = sr.ReadLine()) != null)
19                 {
20                     if (strlyric == "")
21                     {
22                         continue;//若有空行则跳过该次循环
23                     }
24                     Lyric lyric = new Lyric();
25                     try
26                     {
27                         lyric.minute = Convert.ToInt32(strlyric.Substring(1, 2));//从第二个开始
28                         lyric.second = Convert.ToSingle(strlyric.Substring(4, 5));//从第五个开始
29                         lyric.strLyric = strlyric.Substring(10);
30 
31                         lyric.totsecond = (float)(lyric.minute * 60 + lyric.second);
32 
33                         Lyric_List.Add(lyric);//加入歌词
34                     }catch(Exception e)
35                     {
36                         continue;
37                     }
38                 }
39 
40                 sr.Close();
41                 fs.Close();
42                 return true;
43             }
44             else
45             {
46                 return false;
47             }
48         }
49     }
  • 显示歌词

在歌词文件成功载入后,我们需要在主界面对歌词进行显示。

主界面载入歌词LoadLyric

 1 LyricFile lyricfile = new LyricFile();//保存歌词文件
 2 List<int> postion = new List<int>();//保存每行歌词的位置
 3         //载入歌词
 4         private bool LoadLyric(String filename)
 5         {
 6             bool flag= lyricfile.LoadLyricFromFile(filename);
 7             for (int i = 0; i < lyricfile.Lyric_List.Count; i++)
 8             {
 9                 postion.Add(i * 30 + 150);//设置歌词输出的位置
10             }
11             return flag;
12         }

 

显示歌词ShowLyric时使用了GDI+进行歌词的绘制

1 private void ShowLyric()
2         {
3             Graphics g = this.CreateGraphics();
4             for(int i=0;i<lyricfile.Lyric_List.Count;i++)
5             {
6                 g.DrawString(lyricfile.Lyric_List[i].strLyric, new Font("宋体", 13), Brushes.Coral, new Point(300, postion[i]));
7             }
8             g.Dispose();
9         }

 

  •  歌词滚动

至此我们已经实现了歌曲的播放和歌词的载入了,但歌词光是静态不动可不行,当歌曲播放时歌词应当随之滚动并显示当前播放的是哪句歌词,在这里我们可以使用歌词的时间点来进行判断,因为在axWindowsMediaPlayer中有播放时间的属性用来记录当前歌曲的播放时间和总时长,由于歌词需要刷新,因此我们可以在的paint事件中放置我们的歌词滚动方法,再向窗体拖入一个Timer控件,当随着时间流逝时改变歌词的位置和当前行的位置,这样就实现了歌词的滚动.

Initpostion列表保存歌词的初始位置

currentline字段表示当前播放的是哪一行歌词

画出歌词DrawLyric

 1  1 //画出歌词
 2  2         public void DrawLyric()
 3  3         {
 4  4             Graphics g = this.CreateGraphics();
 5  5             if (isPlay)
 6  6             {
 7  7                 if (lyricfile.Lyric_List.Count > 0)
 8  8                 {
 9  9                     for (int i = 0; i < postion.Count; i++)
10 10                     {
11 11                         if (currentline == i)//当前行颜色为黄
12 12                         {
13 13                             g.DrawString(lyricfile.Lyric_List[i].strLyric, new Font("宋体", 13), Brushes.Yellow, new Point(300, postion[i]));
14 14                         }
15 15                         else
16 16                         {
17 17                             g.DrawString(lyricfile.Lyric_List[i].strLyric, new Font("宋体", 13), Brushes.Coral, new Point(300, postion[i]));
18 18                         }
19 19 
20 20                     }
21 21                 }
22 22             }
23 23         }

Timer方法歌词滚动

 1 int currentline = 0;
 2         private void timer1_Tick(object sender, EventArgs e)
 3         {
 4             double pos = axplayer.Ctlcontrols.currentPosition;//获取当前播放的时间
 5                     if (lyricfile.Lyric_List.Count > 0)
 6                     {
 7                         if (currentline + 1 < lyricfile.Lyric_List.Count)
 8                         {
 9                             if (pos > lyricfile.Lyric_List[currentline + 1].totsecond)//若当前时间超过歌词时间则切换下一行
10                             {
11                                 currentline++;//当前播放行数加1
12                                 for (int i = 0; i < postion.Count; i++)
13                                 {
14                                     postion[i] -= 30;//歌词向下滚动
15                                 }
16                             }
17                         }
18                     }
19         }

这样随着歌曲的播放歌词会向上滚动

  • 进度条切换播放时间

综上我们实现了歌曲的播放、歌词的载入、歌词的滚动,但歌曲也只能顺序播放而无法切换到某个特定的位置,因此我们向窗体中拖入了一个进度条,用于切换歌曲播放的进度,由于C#自带的trackbar太丑,于是我自己设计了一个进度条,用一个panel将它的高度设成2和一个picturebox组成,当点击panel的某个地方时,歌曲就会跳转到相应的时间点。

歌曲跳转

 1 //改变进度
 2         private void changeprogress(int X)//X表示在panel上点击的位置
 3         {
 4             float x = (float)(X);
 5             float y = (float)pnl_progress.Width;
 6             double progress = (float)(x / y);//切换的进度 
 7 
 8             axplayer.Ctlcontrols.currentPosition = axplayer.currentMedia.duration * progress;//切换歌曲进度 9        }

 

至此音乐盒的基本功能就实现完了,具体实现可以参照我的项目码云地址:https://gitee.com/zhaoxiaoqin/KuGoumusic_player.git

接下来我们可以将项目进行打包成setup安装程序

具体实现如下:

  • 下载Microsoft Visual Studio 2017 Installer插件并安装

进入Visual Studio中点击”工具-扩展和更新-联机-搜索Microsoft Visual Studio 2017 Installer-下载-重启Visual Studio”

 

  • 新建打包项目 

 将Microsoft Visual Studio 2017 Installer插件安装好之后,就可以新建打包项目了

“右击你的解决方案-添加-新建项目-其他项目类型-Visual Studio Installer-Setup Project”,将项目放置在合适的位置

  • 添加打包文件

 在新建了Setup项目后可以看到如下界面:

其中Application Folder就是存放你的项目文件的地方,将你项目必须的文件都放到这个文件夹中

User’s Desktop是用户安装后桌面快捷方式的文件夹

User\’s Programs Menu是存放安装后文件夹的地方

“右击Application Folder-Add-项目输出-选择你的项目名称-点击主输出-确定”

在Application Folder中就会自动生成一些项目必须的文件

然后”右击主输出文件-Create Shortcut”,创建快捷方式,并将该快捷方式拖到User’s Desktop文件夹中,

用于显示安装后的程序。

  • 生成setup安装文件

 在解决方案资源管理器中找到setup项目,右击该项目点生成

下方显示生成成功后

我们在Setup1\Debug文件夹中可以看到两个文件

这两个文件便是你的项目的安装程序,点击setup.exe后打开安装程序就可以进行项目的安装了。

综上酷狗音乐盒的编写就介绍完了,详细代码可以从我的码云上下载

码云地址:https://gitee.com/zhaoxiaoqin/KuGoumusic_player

 

版权声明:本文为zhaoxiaoqin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhaoxiaoqin/p/9899764.html