梦之翼团队项目(音乐播放器)
一 设计思路
整体概括:
当我们得到这个项目时,也感觉到了迷茫,不过经过查阅资料,我们还是克服了,我们想做一个类似于酷狗音乐的那样,但是只是能力有限,做到了现在这个程度,我们用的是程序自身的一个插件,这个插件有许多功能都已经有了,(当时我们也想过使用类库,但是能力可能太差了,不过,我们会尝试的),既然插件自身有许多功能,那么我们就对它没有的功能进行了进一步的开发!
(1)软件界面介绍:
上面有:播放,暂停,上一曲,下一曲,音量,添加歌曲及添加歌曲文件夹,单曲循环,随机播放,顺序播放,清空列表,退出程序,添加皮肤等功能
(2) 添加歌曲或者添加歌曲文件夹
当播放列表中为空时,进行添加歌曲,有两种方式,一种是歌曲一首或者多首的交叉选择,一种是整个文件夹的选择
上图:
(3) 添加完歌曲就可以进行相关操作了,自带插件的功能不做过多分析了,接下来就是播放模式的功能分析,播放模式有单曲循环,随机播放,顺序播放等,每次选择之前必须先暂停歌曲,在进行相关的选择,图片说明:
(4) 清空列表和退出程序,当用户不想听这些歌曲了,可以清空列表,进行重新的选择,也可以直接退出程序,
(5)接下来就是一个小功能了,添加皮肤,当用户想更换皮肤时,可以单击右上角的心形图标,即可
二 代码编写
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.Xml; namespace MusicPlayer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string[] musicPath = new string[1000]; //用于保存歌曲目录 int musicCount = 0; private void Form1_Load(object sender, EventArgs e) { axWindowsMediaPlayer1.BeginInit(); //播放器相关属性的设置 axWindowsMediaPlayer1.settings.autoStart = true; axWindowsMediaPlayer1.settings.setMode("shuffle", false); axWindowsMediaPlayer1.settings.enableErrorDialogs = true; axWindowsMediaPlayer1.settings.balance = 0; axWindowsMediaPlayer1.settings.mute = false; axWindowsMediaPlayer1.settings.volume = 100; if (File.Exists("listbox.txt")) //如果存在播放列表,那么加载播放列表 { StreamReader reader = new StreamReader("listbox.txt"); try { while (reader.Peek() != -1) { string filepath = reader.ReadLine(); if (File.Exists(filepath)) { musicPath[musicCount++] = filepath; string filename = Path.GetFileName(filepath); listBox1.Items.Add(filename); //listbox用来显示歌曲名 axWindowsMediaPlayer1.currentPlaylist.insertItem(axWindowsMediaPlayer1.currentPlaylist.count, axWindowsMediaPlayer1.newMedia(filepath)); } } listBox1.SelectedIndex = 0; } catch (Exception) { listBox1.SelectedIndex = -1; MessageBox.Show("加载播放列表失败或者列表为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { reader.Close(); } } } private void 添加本地歌曲ToolStripMenuItem_Click(object sender, EventArgs e) //添加本地歌曲的方法 { aa.FileName = ""; aa.Multiselect = true; DialogResult dr = aa.ShowDialog(); if (dr == DialogResult.OK) { axWindowsMediaPlayer1.URL = aa.FileName; string[] filepath = aa.FileNames; foreach (string filename in filepath) { if (Path.GetExtension(filename) == ".mp3") { string filenam = Path.GetFileName(filename); listBox1.Items.Add(filenam); musicPath[musicCount++] = filename; axWindowsMediaPlayer1.currentPlaylist.insertItem(axWindowsMediaPlayer1.currentPlaylist.count, axWindowsMediaPlayer1.newMedia(filename)); } } } } private void 添加本地歌曲文件夹ToolStripMenuItem_Click(object sender, EventArgs e)//添加本地歌曲文件夹的方法 { DialogResult dr = folderBrowserDialog1.ShowDialog(); if (dr == DialogResult.OK) { string[] filepath = Directory.GetFiles(folderBrowserDialog1.SelectedPath); foreach (string s in filepath) { if (Path.GetExtension(s) == ".mp3") { string filename = Path.GetFileName(s); listBox1.Items.Add(filename); musicPath[musicCount++] = s; axWindowsMediaPlayer1.currentPlaylist.insertItem(axWindowsMediaPlayer1.currentPlaylist.count, axWindowsMediaPlayer1.newMedia(s)); } } } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) //双击列表歌曲播放的方法 { int j = listBox1.SelectedIndex; if (listBox1.Items.Count > 0 && listBox1.SelectedIndex >= 0) { axWindowsMediaPlayer1.Ctlcontrols.playItem(axWindowsMediaPlayer1.currentPlaylist.get_Item(listBox1.SelectedIndex)); } } private void button2_Click(object sender, EventArgs e) //添加背景图片的方法 { DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) { pictureBox1.ImageLocation = openFileDialog1.FileName; } } private void 顺序播放ToolStripMenuItem_Click(object sender, EventArgs e) //顺序播放的方法 { axWindowsMediaPlayer1.settings.playCount = 1; axWindowsMediaPlayer1.currentPlaylist.clear(); for (int j = 0; j < musicCount; j++) { if (musicPath[j] != string.Empty) { axWindowsMediaPlayer1.currentPlaylist.insertItem(axWindowsMediaPlayer1.currentPlaylist.count, axWindowsMediaPlayer1.newMedia(musicPath[j])); } } axWindowsMediaPlayer1.settings.setMode("shuffle", false); axWindowsMediaPlayer1.Ctlcontrols.playItem(axWindowsMediaPlayer1.currentPlaylist.get_Item(0)); } private void 单曲循环ToolStripMenuItem_Click(object sender, EventArgs e) //单曲循环的方法 { axWindowsMediaPlayer1.Ctlcontrols.stop(); axWindowsMediaPlayer1.currentPlaylist.clear(); if (listBox1.SelectedIndex != -1 && listBox1.Items.Count > 0) { int k = listBox1.SelectedIndex; for (int i = 0; i < 1000; i++) { axWindowsMediaPlayer1.currentPlaylist.insertItem(axWindowsMediaPlayer1.currentPlaylist.count, axWindowsMediaPlayer1.newMedia(musicPath[k])); } } axWindowsMediaPlayer1.Ctlcontrols.playItem(axWindowsMediaPlayer1.currentPlaylist.get_Item(0)); } private void 随机播放ToolStripMenuItem_Click(object sender, EventArgs e) //随机播放的方法 { axWindowsMediaPlayer1.settings.playCount = 1; axWindowsMediaPlayer1.Ctlcontrols.stop(); axWindowsMediaPlayer1.currentPlaylist.clear(); Random rd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < 1000; i++) { int j = rd.Next(0, musicCount); if (musicPath[j] != string.Empty) { axWindowsMediaPlayer1.currentPlaylist.insertItem(axWindowsMediaPlayer1.currentPlaylist.count, axWindowsMediaPlayer1.newMedia(musicPath[j])); } } axWindowsMediaPlayer1.Ctlcontrols.playItem(axWindowsMediaPlayer1.currentPlaylist.get_Item(0)); } private void 清空列表ToolStripMenuItem_Click(object sender, EventArgs e) //清空播放列表的方法 { axWindowsMediaPlayer1.Ctlcontrols.stop(); //先停止播放器 listBox1.Items.Clear(); //清空listbox axWindowsMediaPlayer1.currentPlaylist.clear(); //清空播放列表 for (int j = 0; j < musicCount; j++) { musicPath[j] = ""; } } private void 退出程序ToolStripMenuItem_Click(object sender, EventArgs e) //退出程序的方法 { axWindowsMediaPlayer1.Ctlcontrols.stop(); axWindowsMediaPlayer1.close(); StreamWriter writer = new StreamWriter("listbox.txt", false, Encoding.Unicode); //保存播放列表 for (int i = 0; i <= musicCount - 1; i++) { if (musicPath[i] != string.Empty) { writer.WriteLine(musicPath[i]); } } writer.Close(); Application.Exit(); } } }
三 软件测试
软件测试我们遇到许多困难,但是经过成员的努力,也克服了许多,下面直接上图
四 PSP耗时分析
五 团队成员任务分配
六 总结
这是我们第一进行团队项目,整个过程感觉棒棒哒!经过每位成员的不懈努力,我们终于把这个项目拿下来咯,做出来了一个还算完美的播放器(ps:嘿嘿,小自恋一下咯,这个软件还有需要改进的地方,不过,我们团队还会继续加油的!)哈哈,以后我们就可以用自己做的播放为听歌啦!
每一个成功的背后都有无数的艰辛与困难,我们团队中间也遇到了许多问题,例如:
一:团队整体的运行与成员的相互磨合
二:软件整体功能的架构
三:相关控件知识的查询(因为有些控件是第一次接触)
四:软件测试知识缺乏,不懂测试
五:知识水平层次不同
...........
不过,这些困难经过大家的日夜奋战,我们把其中的大部分都攻破了,现在我真的体会到了,每一个软件的成功发布,都有无数个难以忘记的艰辛所构成,都有一个坚强且伟大的团队所作出的不懈努力!
接下来,我们就对这个软件团队做一个小总结:
一:任何一个团队里面都存在分歧,我们所要做的就是认真商议,拿出优秀的解决方案,积极解决一切问题
二:团队成员的知识能力和编码能力不同,我们一定要把团队结构最优化,每个人做适合自己的任务,并且相互协作,共同完成任务
三:针对知识能力不同,我们每个成员都要认真学习课本知识,打好基础
四:成员之间一定要培养默契度,并且都要有一定的时间观念和执行力,只有这样,才能保证一个软件保质保量保时完成。
五:这样的团队任务很有实际意义,可以增加同学之间的相互交流与团队协作能力,挺好的,么么哒!
........
以上就是我们对这个软件团队项目所作出的总结,希望老师阅读后,批评指正,谢谢老师!