小学生之KTV播放原理
第一步:
创建一个Song类
//歌曲名称
public string SongName { get; set; }
//歌曲路劲
public string SongPath { get; set; }
第二步:
创建一个ListSong类
//存储要播放的歌曲
public static List<Song> list = new List<Song>();
public static int SongIndex = 0;//当前播放的歌曲在集合中的索引
/// <summary>
/// 把歌曲添加到List集合中
/// </summary>
public static void AddSong(Song song)
{
list.Add(song);
}
/// <summary>
/// 获得播放的歌曲
/// </summary>
public static Song GetPalySong()
{
if (list.Count > 0) àà判断集合中是否是元素
{
if (list.Contains(list[SongIndex])) //看集合中是否包含list[SongIndex]这首歌
{
return list[SongIndex];
}
}
return null;
}
/// <summary>
/// 获取下一首播放歌曲的名字
/// </summary>
/// <returns></returns>
public static string GetNextSongName()
{
string name=string.Empty; //定义一个name字段,接受要播放下一首歌曲的名称
if (list.Count>1) //集合中的元素必须大于1才能获取下一首歌曲的名称
{
name = list[SongIndex + 1].SongName;
}
return name;
}
/// <summary>
/// 播放下一首
/// </summary>
public static void MoveOn()
{
//判断当前的歌曲不等于空并且播放歌曲的状态不是重播的情况下就执行SongIndex++,从而实现播放下一首歌曲
if (list[SongIndex] != null && list[SongIndex].Sate == Sateze.again)
{
list[SongIndex].ChagenSate();
}
else
{
SongIndex++;
}
}
第三步:
在点击DataGirlView控件中的一首歌曲时,
//创建一个Song类对象
Song song = new Song();
//获取歌曲名称
song.SongName = this.dataGridView1.SelectedRows[0].Cells[3].Value.ToString();
//获取歌曲路劲
song.SongPath = this.dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
/调用ListSong中的AddSong方法给集合中添加数据
ListSong.AddSong(song);
第四步:
在主窗体FrmMain中定义一个Song类对象,接受要播放的歌曲
private Song song;//当前播放的歌曲
//定义一个方法播放要播放的歌曲
/// <summary>
/// 播放歌曲
/// </summary>
public void LoadPalyedSong()
{
this.song = ListSong.GetPalySong();//调用ListSong类中的GetPalySong方法,
if (song!=null)
{
this.song.ChagenSate(); //改变歌曲的状态
axWindowsMediaPlayer1.URL = @"E:\KTV\song\" + this.song.SongPath; //:播放器播放的路劲
this.textBox1.Text = this.song.SongName; //当前播放的歌曲名称
this.textBox2.Text = ListSong.GetNextSongName(); //调用ListSong类中的GetNextSongName方法获取下一首歌曲的名字
}
}
在主窗体FrmMain中有一个Timer空间,它有一个Tick事件,在它的事件中有这样几句代码
if (song==null) //强行将song置为空,为了播放歌曲
{
LoadPalyedSong();
}
//播放下一首歌曲 判断播放器空间的状态为停止时
if (axWindowsMediaPlayer1.playState==WMPLib.WMPPlayState.wmppsStopped)
{
song = null; //将song置为空,song指向下一首歌曲
ListSong.MoveOn(); //调用ListSong类中的MoveOn方法播放下一首歌曲
}
第五步:
将从DataGirlView空间中选择的歌曲添加到ListView控件中
this.listView1.Items.Clear(); //首先清空一下ListView控件
foreach (Song item in ListSong.list) //遍历整个集合
{
ListViewItem lvitem = new ListViewItem(item.SongName);
lvitem.SubItems.Add(item.SongPath);
string sate = item.Sate == Sateze.unPaly ? "未播放" : "已播放";
lvitem.SubItems.Add(sate);
this.listView1.Items.Add(lvitem); //绑定到ListView控件中
}
小学生之KTV播放原理的更多相关文章
- KTV点歌系统播放原理
北大青鸟KTV点歌系统播放原理 指导老师--原玉明 1.首先知道有两个类(PlayList Song) PlayList类中有一方法 public static bool AddSong(Song ...
- KTV歌曲播放原理
歌曲播放原理 一开始要有一个Song类,在类外面定义枚举,在里面放四种状态, 为:已播放,未播放,重唱,切歌 在类里把歌曲名称和路径封装成字段 起初每首歌的状态默认为未播放 通过MadeSongPla ...
- 小学生之KTV项目文档(bdqn)
第一步:创建数据库连接方法和打开方法和关闭方法! 1 public class DBHelper 2 { 3 private string str = "server=.;database= ...
- KTV项目 SQL数据库的应用 结合C#应用窗体
五道口北大青鸟校区 KTV项目 指导老师:袁玉明 歌曲播放原理 SQL数据库关系图 C#解决方案类图 第一步:创建数据库连接方法和打开方法和关闭方法! public class DBHelper { ...
- iOS视频边下边播--缓存播放数据流
实现视频边下边播,这里的边下边播不是单独开一个子线程去下载,而是把视频播放的数据给保存到本地.简而言之,就是使用一遍的流量,既播放了视频,也保存了视频. 用到的框架:<AVFoundation/ ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇01:播放序列动画》
1.播放序列动画 系列动画播放概述 2D游戏中的动画系统,不同于3D游戏.3D游戏中,角色美术资源不仅包含角色模型的,还包括角色的贴图和动作等,模型本身自带角色的动作动画效果.2D游戏中,角色美术资源 ...
- 视频边下边播--缓存播放数据流-b
google搜索“iOS视频变下边播”,有好几篇博客写到了实现方法,其实只有一篇,其他都是copy的,不过他们都是使用的本地代理服务器的方式. 原理很简单,但是缺点也很明显,需要自己写一个本地代理服务 ...
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程06:技能播放的逻辑关系》
6.技能播放的逻辑关系 技能播放概述: 当完成对技能输入与检测之后,程序就该对输入在缓存器中的按键操作与程序读取的技能表信息进行匹配,根据匹配结果播放相应的连招技能. 技能播放原理: 按键缓存器中内容 ...
- WM8960音频播放
第一节 音频播放原理首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=205 ...
随机推荐
- SQL server概述
sqlserver中包含的对象: 数据库.事务日志.索引.文件组.数据库关系图.视图.存储过程.用户自定义函数.用户.角色.程序集.表.报表.全文目录.用户自定义数据类型 数据库实际上是最高层对象,其 ...
- C#之重定向输入输出
当我们写完程序,想要在另一个平台上跑我们所写的程序的时候,就需要用到重定向输入输出. 重定向有两中方式,即同步和异步. 下面来讲讲同步 代码: Process process = new Proces ...
- [欢度国庆]为什么我们今天还要学习和使用C++?(转载)
在各种新的开发语言层出不穷的今天,在Java和C#大行其道今天,我们为什么还要学习和使用C++?现在学习C++将来有用吗?学习C++要花费那么多时间和精力,这一切都值得吗?现在学习C++有钱途吗? 这 ...
- GetTextMetrics
该函数的参数要求是一个TEXTMETRIC结构体的指针 也就是说我们可以定义一个结构类型的变量 将该变量的地址传递进来 通过该函数就能得到当前字体的信息来填充这个结构体 int CXuexi2View ...
- javascript中的事件问题
事件的类型: (1)鼠标事件: click用户点击鼠标时发生,当用户的焦点在按钮上,并按了回车键,同样会触发这个事件 dbclick 用户双击鼠标左键时发生 mouseover 鼠标移出某个 ...
- 删除Excel中的打印预览留下的打印线
Excel 工作表打印后,会留有几条虚线打印线.如下图所示: 不少同学反映,他们尝试了很多操作却仍然无法消除.难道除了重新打开就没有别的办法了? 可以这样做: 在 Excel 2010 中,单 ...
- js中给函数传参函数时,函数加括号与不加括号的区别
<!doctype html><html><head><script> function show() { alert("123") ...
- 深入理解querySelector(All)
querySelector和querySelectorAll同属于Selectors API Level 1规范,该规范早在2006年就已经开始发展,并在2007年10月形成querySe ...
- 转:Java反射教程
原文来自于:http://www.importnew.com/9078.html 什么是反射?反射有什么用处? 1. 什么是反射? “反射(Reflection)能够让运行于JVM中的程序检测和修改运 ...
- CPU进程与线程的关系和区别
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. ...