使用C#开发一个简易的音乐播放器。
运行效果图:
布局简述:
新建一个Windows窗体应用,拖一个tableLayoutPanel容器,设置为6行两列。拖入一个label,button,设置其位置。拖一个进度条,调整其密度。调整表格第五行的内容,使其能放5个按钮进去,组件布局基本完成。
功能描述:
点击“添加歌曲”按钮打开存放歌曲的文件夹,将准备好的歌曲添加到目录中。单击列表的歌曲开始播放。单击“播放”按钮播放当前选中的歌曲,没有选中的默认播放第一首。点击“暂停”按钮,当前播放歌曲暂停,再次单击播放,恢复播放。单击“停止”,结束播放。上一首,下一首见名知意。进度条会随着当前播放歌曲的进度,不断向前走,当走到结尾,切换到下一首,如果已经为最后一首,那么就切换到第一首,拖动进度条可以改变歌曲的播放进度。
更详细的说明见代码注释
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//声明IO流,对文件进行操作
using System.IO;
//声明播放器库
using WMPLib;
namespace MusicPlayerDemo
{
public partial class Form1 : Form
{
//获取文件的路径
List<string> listPath = new List<string>();
//定义滑动条的最大最小值
double maxTime, minTime;
public Form1()
{
InitializeComponent();
}
//添加歌曲到列表
private void btnAddMusic2List_Click(object sender, EventArgs e)
{
//实例化打开窗体实例
OpenFileDialog of = new OpenFileDialog();
of.Title = "请选择音乐文件";
//对话框可以选中多个文件
of.Multiselect = true;
of.Filter = "(*.mp3)|*.mp3";
//of.ShowDialog();
//将用户选中的文件添加到音乐播放列表中
if(of.ShowDialog() == DialogResult.OK)
{
//得到文件名和扩展的数组
string[] fileNames = of.FileNames;
foreach(string name in fileNames)
{
//获取不具有扩展名的指定文件名
string pathName = Path.GetFileNameWithoutExtension(name);
listBoxMusics.Items.Add(pathName);
listPath.Add(name);
}
}
}
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
}
private void listBoxMusics_SelectedIndexChanged(object sender, EventArgs e)
{
//获取当前选中文件的索引
int selectIndex = listBoxMusics.SelectedIndex;
//音乐播放器是根据文件的URL去播放的
axWindowsMediaPlayer1.URL = listPath[selectIndex];
timer1.Enabled = true;
}
//上一首
private void btnLastMusic_Click(object sender, EventArgs e)
{
//上一首在当前选中的索引减1即可
int selectIndex = listBoxMusics.SelectedIndex - 1;
if(selectIndex < 0)
{
selectIndex = 0;
}
//点击上一首了,选中的行也向上移
listBoxMusics.SelectedIndex = selectIndex;
//音乐播放器是根据文件的URL去播放的
axWindowsMediaPlayer1.URL = listPath[selectIndex];
//这是选中当前文件的下标
//labMusicName.Text = listBoxMusics.SelectedIndex.ToString();
//SelectedItem选中文件的名称
labMusicName.Text = listBoxMusics.SelectedItem.ToString();
}
//下一首
private void btnNextMusic_Click(object sender, EventArgs e)
{
//下一首在当前选中的索引加1即可
int selectIndex = listBoxMusics.SelectedIndex + 1;
//如果索引超过了记录总数,那么索引应该减去1
if (selectIndex >= listBoxMusics.Items.Count)
{
selectIndex = selectIndex - 1;
}
//点击下一首了,选中的行也向下移
listBoxMusics.SelectedIndex = selectIndex;
//音乐播放器是根据文件的URL去播放的
axWindowsMediaPlayer1.URL = listPath[selectIndex];
//SelectedItem选中文件的名称
labMusicName.Text = listBoxMusics.SelectedItem.ToString();
}
//暂停
private void btnSuspend_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
//停止
private void btnStop_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
timer1.Enabled = false;
}
//播放
private void btnBroadcast_Click(object sender, EventArgs e)
{
//下一首在当前选中的索引加1即可
int selectIndex = listBoxMusics.SelectedIndex;
//如果索引超过了记录总数,那么索引应该减去1
if (selectIndex < 0)
{
selectIndex = selectIndex < 0 ? 0 : selectIndex;
//点击下一首了,选中的行也向下移
listBoxMusics.SelectedIndex = selectIndex;
//音乐播放器是根据文件的URL去播放的
axWindowsMediaPlayer1.URL = listPath[selectIndex];
//SelectedItem选中文件的名称
labMusicName.Text = listBoxMusics.SelectedItem.ToString();
}
else
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//获取文件的最大长度,即最大时间
maxTime = axWindowsMediaPlayer1.currentMedia.duration;
//获取文件当前的播放位置
minTime = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
trackBarSpeed.Maximum = (int)maxTime;
trackBarSpeed.Value = (int)minTime;
//当进度条到最后了,自动切换到下一首
if(axWindowsMediaPlayer1.playState == WMPPlayState.wmppsStopped)
{
int selectedIndex = listBoxMusics.SelectedIndex + 1;
selectedIndex = selectedIndex == listBoxMusics.Items.Count ? 0 : selectedIndex;
axWindowsMediaPlayer1.URL = listPath[selectedIndex];
listBoxMusics.SelectedIndex = selectedIndex;
labMusicName.Text = listBoxMusics.SelectedItem.ToString();
trackBarSpeed.Value = 0;
timer1.Enabled = true;
}
}
//鼠标按下的时候拖动滚动条
private void trackBarSpeed_MouseDown(object sender, MouseEventArgs e)
{
timer1.Enabled = false;
axWindowsMediaPlayer1.Ctlcontrols.pause(); //暂停
}
private void trackBarSpeed_MouseUp(object sender, MouseEventArgs e)
{
double currPosi = trackBarSpeed.Value;
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = currPosi;
axWindowsMediaPlayer1.Ctlcontrols.play();
timer1.Enabled = true;
}
}
}
需要引用的两个包,在文件开头已经说明。