上一个版本的mp3 player时间仓促,代码中存在不少错误,功能也不完善。这一个多月一直用自己做的seaPlayer (给它暂时取个名字) 听歌, 改了不少漏洞,还完善了一些功能。这些功能有:
1. 最小化时隐藏界面,只在显示在状态栏里显示图标。
2. 退出程序时能将播放列表中的歌曲保存起来,以便下次启动播放器时能装载列表。
3. 增加了文件拖放功能,把想听的歌曲直接拖到窗口就可以添加进列表。
4. 增加了键盘del键对删除歌曲的控制,可以方便删除不想听的歌曲。
下面是部分关键代码:
seaPlayer.cs:
namespace seaPlayer
{
public class seaPlayer : System.Windows.Forms.Form
{
……
static void Main()
{
Application.Run(new seaPlayer());
}
/* 将指定文件夹包括其子文件夹内所有mp3文件添加到播放列表 */
private void showfiles(string path,ListBox listBox1)
{
DirectoryInfo dir = new DirectoryInfo(path);
foreach(FileInfo f in dir.GetFiles("*.mp3"))
{
MyPlayer.AddFile(f.FullName);
}
foreach(DirectoryInfo f in dir.GetDirectories())
{
showfiles(f.FullName,listBox1);
}
}
/* 将播放列表的内容装载到listbox中 */
private void Load()
{
listBox1.Items.Clear();
for(int i = 1;i <= MyPlayer.NumOfMusic; i++)
{
string STRFILE = Convert.ToString(i);
for(int j = 1;j<=5-STRFILE.Length;j++)STRFILE+=' ';
FileInfo f = new FileInfo(MyPlayer.PlayList(i));
STRFILE += f.Name;
this.listBox1.Items.Add(STRFILE);
}
}
/* 双击状态栏图表,窗口变为非隐藏 */
private void notifyIcon1_DoubleClick(object sender, System.EventArgs e)
{
this.Visible = true;
this.WindowState = System.Windows.Forms.FormWindowState.Normal;
this.notifyIcon1.Visible = false;
}
/* 窗口最小化时,只在状态栏显示 */
private void Form1_Resize(object sender, System.EventArgs e)
{
if(this.WindowState == System.Windows.Forms.FormWindowState.Minimized)
{
this.notifyIcon1.Visible = true;
this.Visible = false;
}
}
/* 添加单个文件到列表 */
private void menuItem2_Click(object sender, System.EventArgs e)
{
if(this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
string path = this.openFileDialog1.FileName;
FileInfo f = new FileInfo(path);
MyPlayer.AddFile(f.FullName);
Load();
}
}
/* 将文件夹包括子文件夹内容添加到列表 */
private void menuItem3_Click(object sender, System.EventArgs e)
{
if(this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
string path = this.folderBrowserDialog1.SelectedPath;
showfiles(path,listBox1);
Load();
}
}
/* 双击歌曲播放 */
private void listBox1_DoubleClick(object sender, System.EventArgs e)
{
if(listBox1.SelectedIndex >= 0)
MyPlayer.play(listBox1.SelectedIndex + 1);
}
/* 删除指定歌曲 */
private void menuItem4_Click(object sender, System.EventArgs e)
{
if(listBox1.SelectedIndex >= 0)
{
MyPlayer.DelFile(listBox1.SelectedIndex + 1);
listBox1.Items.Clear();
Load();
}
}
/* 删除所有歌曲 */
private void menuItem7_Click(object sender, System.EventArgs e)
{
listBox1.Items.Clear();
MyPlayer.NumOfMusic = 0;
}
/* 退出程序 */
private void menuItem9_Click(object sender, System.EventArgs e)
{
MyPlayer.save();
Application.Exit();
}
/* 播放上一首歌曲 */
private void menuItem10_Click(object sender, System.EventArgs e)
{
if(MyPlayer.CurrentPlay > 0)
{
int play = MyPlayer.CurrentPlay - 1;
if(play == 0)play = MyPlayer.NumOfMusic;
MyPlayer.play(play);
listBox1.SelectedIndex = play - 1;
}
}
/* 播放下一首歌曲 */
private void menuItem11_Click(object sender, System.EventArgs e)
{
if(MyPlayer.CurrentPlay > 0)
{
int play = MyPlayer.CurrentPlay + 1;
if(play > MyPlayer.NumOfMusic)play = 1;
MyPlayer.play(play);
listBox1.SelectedIndex = play - 1;
}
}
/* 监视播放器播放的状态,如果一首歌播放结束则转到相应处理 */
private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if(MyPlayer.playstate == WMPLib.WMPPlayState.wmppsMediaEnded)
{
timer1.Start();
}
}
private void timer1_Tick(object sender, System.EventArgs e)
{
timer1.Stop();
int selectnum = 0;
if(menuItem13.Checked)selectnum = MyPlayer.NextPlay(0);
else if (menuItem15.Checked)selectnum = MyPlayer.NextPlay(1);
else if (menuItem16.Checked)selectnum = MyPlayer.NextPlay(2);
else if (menuItem17.Checked)selectnum = MyPlayer.NextPlay(3);
if(selectnum != 0)
{
listBox1.SelectedIndex = selectnum - 1;
MyPlayer.play(selectnum);
}
}
/* del键删除指定歌曲 */
private void listBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.KeyCode == Keys.Delete)
{
if(listBox1.SelectedIndex >= 0)
{
int temp = listBox1.SelectedIndex;
MyPlayer.DelFile(listBox1.SelectedIndex + 1);
Load();
if(temp > MyPlayer.NumOfMusic - 1)temp = -1;
listBox1.SelectedIndex = temp;
}
}
}
/* 利用DragEnter和DragDrop两个事件来实现文件拖放 */
private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect=DragDropEffects.Copy;
else
e.Effect=DragDropEffects.None;
}
private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
if(e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
MyPlayer.AddFile(file);
}
Load();
}
}
}
}
Player.cs:
namespace seaPlayer
{
/// <summary>
/// Player 的摘要说明。
/// </summary>
public class Player
{
private AxWMPLib.AxWindowsMediaPlayer myPlayer;
private string[] playList;
private int numOfMusic;
private int currentPlay;
private string savepath;
public int CurrentPlay
{
get
{
return currentPlay;
}
}
public int NumOfMusic
{
get
{
return numOfMusic;
}
set
{
numOfMusic = value;
}
}
public WMPLib.WMPPlayState playstate
{
get
{
return myPlayer.playState;
}
}
public void save()
{
StreamWriter sw = new StreamWriter(savepath);
for(int i = 1; i <= numOfMusic; i ++)
{
sw.WriteLine(playList[i]);
}
sw.Close();
}
public void load()
{
try
{
StreamReader sr = new StreamReader(savepath);
String line;
numOfMusic = 0;
while ((line = sr.ReadLine()) != null)
{
numOfMusic ++;
playList[numOfMusic] = line;
}
sr.Close();
}
catch
{
}
}
public string PlayList(int num)
{
return playList[num];
}
public Player(AxWMPLib.AxWindowsMediaPlayer mediaPlayer)
{
FileInfo t = new FileInfo("save.msg");
savepath = t.FullName;
myPlayer = mediaPlayer;
playList = new string[1001];
numOfMusic = 0;
currentPlay = 0;
load();
}
public void AddFile(string path)
{
if(numOfMusic < 1000)
{
numOfMusic ++;
playList[numOfMusic] = path;
}
}
public void DelFile(int selectNum)
{
for(int i = selectNum; i <= numOfMusic - 1; i++)
{
playList[i] = playList[i + 1];
}
numOfMusic --;
}
public void play(int selectNum)
{
myPlayer.URL = playList[selectNum];
currentPlay = selectNum;
}
public int NextPlay(int type)
{
/* type = 0 顺序
type = 1 重复播放全部
type = 2 重复播放一首
type = 3 随机播放
*/
switch (type)
{
case 0:
currentPlay ++;
if(currentPlay > numOfMusic)return 0;
else return currentPlay;
case 1:
currentPlay ++;
if(currentPlay > numOfMusic) return 1;
else return currentPlay;
case 2:
return currentPlay;
case 3:
Random rdm = new Random(unchecked((int)DateTime.Now.Ticks));
currentPlay = rdm.Next() % numOfMusic;
if(currentPlay == 0) return numOfMusic;
else return currentPlay;
default:
return 0;
}
}
}
}
总算大功告成了,感觉和一般播放器比也差不多拉:) 反正现在我听mp3只用seaPlayer了,毕竟嘛,小巧又方便哦。还是免费的哦!