C#基于winform实现音乐播放器
作者:向上的青春233 发布时间:2021-06-27 14:13:14
本文实例为大家分享了C#基于winform实现音乐播放器的具体代码,供大家参考,具体内容如下
首先,右键工具箱的组件,找到选择项,找到Windows Media Player组件并添加。
设计界面:
首先实现基本的功能
给“”老板播放器“的播放暂停添加代码
MusicPlayer.Ctlcontrols.play(); //播放
MusicPlayer.Ctlcontrols.pause();//暂停
MusicPlayer.Ctlcontrols.stop();//停止
首先给Windows Media Player控件改名为MusicPlayer,并在程序加载时关闭自动播放和赋予一个默认的地址。
private void Form1_Load(object sender, EventArgs e)
{
//在程序加载的时候,取消播放器的自动播放功能
MusicPlayer.settings.autoStart = false;
MusicPlayer.URL = @"E:\CloudMusic\陈亮 - 无题.mp3";
label1.Image = Image.FromFile(@"C:\Users\14505\Desktop\继续.jpg");
}
接下来是播放键的按钮
List<string> list = new List<string>();//用于储存音乐的全路径
private void btnPlayorPause_Click(object sender, EventArgs e)
{
if (btnPlayorPause.Text == "播放")
{
if (b)
{
//获得选中的歌曲 让音乐从头播放
MusicPlayer.URL = list[listBox1.SelectedIndex];
}
MusicPlayer.Ctlcontrols.play();
btnPlayorPause.Text = "暂停";
}
else if (btnPlayorPause.Text == "暂停")
{
MusicPlayer.Ctlcontrols.pause();
btnPlayorPause.Text = "播放";
b = false;
}
}
用list集合来存储文件的路径,并且listbox控件的items也对应这list,这样我们可以通过点击listbox选中内容(获取它的索引)来找到对应索引的list集合中的路径并播放。
给listbox添加双击事件:
/// <summary>
/// 双击播放对应的音乐
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listBox1_DoubleClick(object sender, EventArgs e)
{
if (listBox1.Items.Count == 0)
{
MessageBox.Show("请首先原则音乐");
return;
}
try
{
MusicPlayer.URL = list[listBox1.SelectedIndex];
MusicPlayer.Ctlcontrols.play();
btnPlayorPause.Text = "暂停";
lblinformation.Text = MusicPlayer.Ctlcontrols.currentPosition.ToString();
}
catch { }
}
接下来是打开按钮,我们需要打开对话框选取想要的音乐文件
/// <summary>
/// 打开按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "请选择您的文件";
ofd.Filter = "音乐文件|*.mp3|全部文件|*.*";
ofd.InitialDirectory = @"E:\CloudMusic";
ofd.Multiselect = true;
ofd.ShowDialog();
//获得在文本框中选择的全路径
string[] path = ofd.FileNames;
for (int i = 0; i < path.Length; i++)
{
list.Add(path[i]);
//将音乐文件的文件名存储到listbox中
listBox1.Items.Add(Path.GetFileName(path[i]));
}
}
下面是上一首下一首的功能,我们只需要获取listbox控件中当前选中项的索引,在使用lst即可
/// <summary>
/// 下一曲
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button5_Click(object sender, EventArgs e)
{
//获得当前选中的索引
int a = listBox1.SelectedIndex + 1;
//清空所有选中的索引 这里是因为我们开启了多选属性,才需要清理
listBox1.SelectedIndices.Clear();
if (a == listBox1.Items.Count)
{
a = 0;
}
//将改变后的索引重新赋值给当前选中项的索引
listBox1.SelectedIndex = a;
MusicPlayer.URL = list[a];
MusicPlayer.Ctlcontrols.play();
}
/// <summary>
/// 上一曲
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button6_Click(object sender, EventArgs e)
{
int a = listBox1.SelectedIndex - 1;
listBox1.SelectedIndices.Clear();
if (a < 0)
{
a = listBox1.Items.Count - 1;
}
//将改变后的索引重新赋值给当前选中项的索引
listBox1.SelectedIndex = a;
MusicPlayer.URL = list[a];
MusicPlayer.Ctlcontrols.play();
}
给listbox控件添加一个右键菜单,我们需要多选删除功能。
这里必须先清除集合中的内容,再清除listbox控件中的内容,否则会引起程序的异常。
/// <summary>
/// 点击删除选中项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
//要删除列表中的选中项
//先删集合
//首先获得要删除的歌曲的数量
int count = listBox1.SelectedItems.Count;
for (int i = 0; i < count; i++)
{
//先删集合
list.RemoveAt(listBox1.SelectedIndex);
//在删列表
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
}
}
接下来是静音和外放按钮,这里我使用label控件添加了图片(百度自行找播放和暂停的图片即可)
/// <summary>
/// 点击放音或静音
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void label1_Click(object sender, EventArgs e)
{
if (label1.Tag.ToString() == "1")
{
//目的:让你静音
MusicPlayer.settings.mute = true;//静音
//显示静音的图片
label1.Image = Image.FromFile(@"C:\Users\14505\Desktop\暂停.jpg");
label1.Tag = "2";
}
else
{
MusicPlayer.settings.mute = false;
//显示放音图片
label1.Image = Image.FromFile(@"C:\Users\14505\Desktop\继续.jpg");
label1.Tag = 1;
}
}
接下来要加一个播放完自动下一首的功能
我这里使用了歌曲全部时常和当前播放时长去比较,当前播放时常+1等于全部时长时,我们就切换下一首
或者使用bool判断控件的播放状态也是一样的道理
private void timer1_Tick(object sender, EventArgs e)
{
//如果播放器的状态时正在播放中
if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
lblinformation.Text = MusicPlayer.currentMedia.duration.ToString() + "\r\n" + MusicPlayer.currentMedia.durationString + "\r\n" + MusicPlayer.Ctlcontrols.currentPositionString;
double b1 = double.Parse(MusicPlayer.currentMedia.duration.ToString());
double b2 = double.Parse(MusicPlayer.Ctlcontrols.currentPosition.ToString())+1;
//如果歌曲当前的播放时间等于歌曲的总时间,自动播放下一曲 //比较时间的值
if (b1<=b2)
{
//获得当前选中的索引
int a = listBox1.SelectedIndex + 1;
//清空所有选中的索引
listBox1.SelectedIndices.Clear();
if (a == listBox1.Items.Count)
{
a = 0;
}
//将改变后的索引重新赋值给当前选中项的索引
listBox1.SelectedIndex = a;
MusicPlayer.URL = list[a];
MusicPlayer.Ctlcontrols.play();
}
}
//比较时间的值
}
运行截图:
本想添加一个显示歌曲歌词的功能的,但是找了半天也没找到歌词文件的下载方式。
这样一个简单的可以自用的播放器就做好啦!
来源:https://blog.csdn.net/weixin_44006686/article/details/114598370
猜你喜欢
- 效果如下:鄙人虽然开发WPF有些时间,但之前一直是一些简单Template和Style改改之类的工作,并没有深入研究过。此次为了完成工作,首
- 在日常生活中,我们使用maven下载需要的jar包,但是很多的时候由于中央仓库没有,所以我们没有办法下载到需要的jar包,手动去下载上,然后
- 什么是深度优先什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走。在算法实现上来讲,深度优先可以考虑是递归的代名
- 看似很鸡肋其实在某些特殊场景还是比较有用的。比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个map的key和value。
- 本次为了记录开发一个基于webservice接口,去解析对方传送过来的xml字符串。实际使用时遇到的一些问题。传输过来的xml格式大致如下:
- @Validated和BindingResult 使用遇到的坑@Validated 与BindingResult 需要相邻,否则 变量res
- 弃用内容先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调
- 对象内存分配与回收策略对象的内存分配,往大方向讲,就是在堆上分配〔但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在
- 前言平时做一些统计数据,经常从数据库或者是从接口获取出来的数据,单位是跟业务需求不一致的。比如, 我们拿出来的 分, 实际上要是元又比如,我
- 本文实例讲述了Java编程调用微信分享功能。分享给大家供大家参考,具体如下:这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发
- 首先当我们将Dwr3配置好以后,我们可以在浏览器中测试一下,查看一下我们配置的Dwr有没有生效,方法是http://localhost:[你
- java多线程-同步块Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java 同步块用来避免竞争。
- 著名的Java单元测试框架Junit 4已经出来很长时间了,当时我发现JUnit 5已经处于测试版,就准备写文章来介绍JUnit 5.不过因
- 引言mysql 和 oracle 插入的时候有一个很大的区别是:oracle 支持序列做 id;mysql 本身有一个列可以做自增长字段。m
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 一、BIO、NIO、AIO学习Netty需要了解BIO、NIO、AIO,具体可参考Java网络编程IO模型 — BIO、
- 前言如今多线程编程已成为了现代软件开发中的重要部分,而并发编程中的线程同步问题更是一道难以逾越的坎。在Java语言中,synchronize
- 概述MerkleTree被广泛的应用在比特币技术中,本文旨在通过代码实现一个简单的MerkleTree,并计算出Merkle tree的 T
- JNI简介JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C
- java Swing基础教程之图形化实例代码与多线程、泛型等不同,Swing主要在于使用。 下面主要放代码和注释,少说话。(一)