第一步:

创建一个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播放原理的更多相关文章

  1. KTV点歌系统播放原理

    北大青鸟KTV点歌系统播放原理 指导老师--原玉明 1.首先知道有两个类(PlayList   Song) PlayList类中有一方法 public static bool AddSong(Song ...

  2. KTV歌曲播放原理

    歌曲播放原理 一开始要有一个Song类,在类外面定义枚举,在里面放四种状态, 为:已播放,未播放,重唱,切歌 在类里把歌曲名称和路径封装成字段 起初每首歌的状态默认为未播放 通过MadeSongPla ...

  3. 小学生之KTV项目文档(bdqn)

    第一步:创建数据库连接方法和打开方法和关闭方法! 1 public class DBHelper 2 { 3 private string str = "server=.;database= ...

  4. KTV项目 SQL数据库的应用 结合C#应用窗体

    五道口北大青鸟校区 KTV项目 指导老师:袁玉明 歌曲播放原理 SQL数据库关系图 C#解决方案类图 第一步:创建数据库连接方法和打开方法和关闭方法! public class DBHelper { ...

  5. iOS视频边下边播--缓存播放数据流

    实现视频边下边播,这里的边下边播不是单独开一个子线程去下载,而是把视频播放的数据给保存到本地.简而言之,就是使用一遍的流量,既播放了视频,也保存了视频. 用到的框架:<AVFoundation/ ...

  6. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇01:播放序列动画》

    1.播放序列动画 系列动画播放概述 2D游戏中的动画系统,不同于3D游戏.3D游戏中,角色美术资源不仅包含角色模型的,还包括角色的贴图和动作等,模型本身自带角色的动作动画效果.2D游戏中,角色美术资源 ...

  7. 视频边下边播--缓存播放数据流-b

    google搜索“iOS视频变下边播”,有好几篇博客写到了实现方法,其实只有一篇,其他都是copy的,不过他们都是使用的本地代理服务器的方式. 原理很简单,但是缺点也很明显,需要自己写一个本地代理服务 ...

  8. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程06:技能播放的逻辑关系》

    6.技能播放的逻辑关系 技能播放概述: 当完成对技能输入与检测之后,程序就该对输入在缓存器中的按键操作与程序读取的技能表信息进行匹配,根据匹配结果播放相应的连招技能. 技能播放原理: 按键缓存器中内容 ...

  9. WM8960音频播放

    第一节 音频播放原理首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=205 ...

随机推荐

  1. CSS布局注意(纯属个人总结)

    和CSS样式有关多用class,和后台数据有关多用id. 1.使用绝对定位时(偏移量如:top,left...),如果父类没有相对定位,使用绝对定位的元素是相对根元素(即<html>标签) ...

  2. 移植openssh到nuc951 evb板

    移植openssh到nuc951 evb板 一 应用环境: 硬件:nuc951evb 软件:linux2.6.35 bsp 二 交叉编译openssl openssh 1.下载 openssl-1.0 ...

  3. phpwind伪静态规则(IIS,Nginx,Apache)的介绍及代码

    phpwind iis下伪静态规则[ISAPI_Rewrite]RewriteRule ^(.*)/(.*)-htm-(.*)-(.*).html$ $1/$2.php?$3=$4RewriteRul ...

  4. dede去除powered by dedecms

    include/dedesql.classs.php文件中找到第588行: $arrs1 = array(0x63,0x66,0x67,0x5f,0x70,0x6f,0x77,0x65,0x72,0x ...

  5. php 被抛弃使用的函数

    call_user_method()(使用 call_user_func() 替代)     call_user_method_array() (使用 call_user_func_array() 替 ...

  6. 003-C运算符

    运算符 C语言有34种运算符,常见的有加减乘除. 1>算术运算符 1.加 10+2 2.减 20-2 3.乘 12*2 4.除 10/2 5.取余 10%3 = 1; 10%-3 = 1; -1 ...

  7. Linq延迟执行

    LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下 ...

  8. JAVA - 多线程的同步

    多线程的同步 1. 锁对象. 应用场景:当某个数据可能被其他线程修改时,给涉及到数据的方法上锁,保证同一时刻只有拥有这个锁的线程能访问该数据,其他要调用这个方法的线程被阻塞.注意:必须是不同线程访问同 ...

  9. ionic中修改图标的问题

    有两种修改图标的方法,一种是手动配置,另外一种是使用命令 1.手动配置 把图标icon.png复制到resources\android\icon目录下 修改根目录的config.xml文件 <p ...

  10. Android 每隔3s更新一次title

    MainActivity.java public class MainActivity extends Activity { private static int i=0; @Override pro ...