KTV项目
目录
理论 数据库 加控件介绍
添加
切歌
利用数组拼路径
暂停
状态小结
正在播放的视频的显示 3
暂停的视频的显示 2
播放完了显示的是 1
没有加载显示的是 0
我们的玩法
如果状态是1 播放玩长了,可以切歌
播放暂停停止
暂停和播放一起
private void timer1_Tick(object sender, EventArgs e)
{
//获取当前状态
currentState = (int)axWindowsMediaPlayer1.playState;
//判断
//修改我的按钮的文本
if (currentState == 3)
{
button3.Text = "暂停";
}
if (currentState == 2)
{
button3.Text = "播放";
}
}
private void button3_Click(object sender, EventArgs e)
{
//判断
//播放
if(currentState == 3){
//暂停
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
//暂停
if(currentState == 2){
//播放
axWindowsMediaPlayer1.Ctlcontrols.play();
}
if(currentState == 1){
}
}
扩展
我们的媒体控件不可以的大小不可控
这里我们要很好额控制大小就要用到 Panel 这个控件
Panel 这个控件和HTML的 div 差不多
填满
综合应用
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;
namespace db11071206媒体控件作业
{
public partial class Form1 : Form
{
//定义一个歌曲数组
public String[] names = {"刘大壮 - 会不会(吉他版).mp3"
,"沈灵七an - 会不会(温柔女生完整版).mp3"
,"就是南方凯 - 万拒(吉他版).mp3"
,"薛之谦 - 演员.mp3"
,"许嵩 - 断桥残雪.mp3"
};
//定义一个计数器
public int i;
//定义一个显示当前状态的成员变量
public int currentState;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//调用音频加载方法
namesArray(i);
}
private void namesArray(int i)
{
//获取第一个音频名称
String fileName = names[i];
//文件位置
String dirPath = "D:\\CloudMusic";
//拼接路径
String filePath = dirPath + "\\" + fileName;
//调用修改 lable 的值 (显示当前播放歌曲名)
modifyLableText(names);
//给音频赋值
axWindowsMediaPlayer1.URL = filePath;
}
private void modifyLableText(String[] names)
{
//获取当前播放的歌曲名称
String tamp = names[i];
//从中查找 . 的位置
int lookup = tamp.LastIndexOf(".");
//截取文字
String text = tamp.Substring(0, lookup);
//给lable 赋值
label2.Text = text;
}
private void button1_Click(object sender, EventArgs e)
{
//判断我当前的下标
if (i == 0)
{
//让我的 计数器 等于数组长度
i = names.Length;
}
//计数器减一
i--;
//重新加载歌曲信息
namesArray(i);
//给lable 重新赋值
modifyLableText(names);
}
private void timer1_Tick(object sender, EventArgs e)
{
//获取当前状态
currentState = (int)axWindowsMediaPlayer1.playState;
//判断
//修改我的按钮的文本
if (currentState == 3)
{
button3.Text = "暂停";
}
if (currentState == 2)
{
button3.Text = "播放";
}
}
private void button3_Click(object sender, EventArgs e)
{
//判断
//播放
if(currentState == 3){
//暂停
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
//暂停
if(currentState == 2){
//播放
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
private void button2_Click(object sender, EventArgs e)
{
//计数器加一
i++;
//判断我当前的下标
if (i == names.Length)
{
//让我的 计数器 等于0
i = 0;
}
//重新加载歌曲信息
namesArray(i);
//给lable 重新赋值
modifyLableText(names);
}
private void button4_Click(object sender, EventArgs e)
{
//停止
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
private void timer2_Tick(object sender, EventArgs e)
{
//判断我的歌曲转态 播放完后切歌
if (currentState == 1) {
//切换下一首
//计数器加一
i++;
//判断我当前的下标
if (i == names.Length)
{
//让我的 计数器 等于0
i = 0;
}
//调用歌曲加载
namesArray(i);
//给lable 重新赋值
modifyLableText(names);
}
}
}
}
引入添加文件控件
显示控件
两个属性的区别
让播放器播放我选中的视频或者MP3
openFileDialog过滤文件
openFileDialog 过滤文件
(媒体文件)|.mkv|mp3|.mp3
方法一:
方法二:
效果
这种模式要选择
我们可选择多个
这里可以把括号去掉
效果
利用相对路径播放文件
用相对路径播放文件 传输文件是可以一起过去 可以不需要很长的路径
对于代码只需要加上文件名就可以了
复制文件
. 是一个字节
效果
会将文件存进Dubug
代码:
判断文件是否存在
我要判断文件是否存在,避免程序报错
删除文件
如果用户要更新文件,所以这边我们不可以以写return
想要实现此方法,我们要先删掉此文件再拷贝过来
面板切换
panel
这个效果像div一样
利用panel盒子布局
面板切换
点击我的listView 里面项的的里面应该Tag存个一个id,然后给lable
图片盒子
加载图片
利用这个方法可以获得一个图片
设置图片内容
### 对象初始化器
小结
数据库操作
思路构建
数据库设计
歌手表
设想分类
这里是利用歌手字母查找:
利用歌曲查找
id | name | genderType | countryType | pingYing | img |
---|---|---|---|---|---|
1 | 周杰伦 | 男 | 1 | dx | zjl.jpg |
歌曲表
singerId 是外键会关联主键
id | name | album | times | singerId | hot | path |
---|---|---|---|---|---|---|
1 | 一路生花 | 一路生花 | 4.16 | 16 | 200 | 一路生花.mp4 |
歌手类型表
id | name |
---|---|
1 | 华语 |
2 | 日韩 |
3 | 欧美 |
关联
三个表的关联
材料收集
收集媒体资源
手机歌手图片
已面向对象的方式添加
后台:
歌手分类管理:添加分类,删除分类,修改分类,显示所有分类
歌手管理:添加歌手,修改歌手,查询歌手,删除歌手
歌曲管理:增,删,改,查
前台:
界面:歌手点歌,歌曲排名,拼音点歌
播放界面,歌单(上一曲,下一曲,顶歌)
播放按钮,暂停,重新开始,自动下切一首
网易云项目
界面
启动后
代码
主界面
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;
using System.Data;
using System.Data.SqlClient;
namespace 网易元音乐项目
{
public partial class Form1 : Form
{
// old size
Size oldSize;
bool isMax = false;
//播放列表 当前下标
private int currentIdex;
// 当前播放状态
bool isPlay = false;
// 播放列标转台
bool isPlayList = false;
public Form1()
{
InitializeComponent();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
// 关闭窗口
this.Close();
}
private void pbClose_MouseMove(object sender, MouseEventArgs e)
{
//让鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pictureBox2_Click(object sender, EventArgs e)
{
//让窗口最小化
this.Show();
this.ShowInTaskbar = true;
this.WindowState = FormWindowState.Minimized;
this.BringToFront();
}
private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
{
//让鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void splitContainer1_Panel2_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void splitContainer1_Panel1_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void panel2_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void panel3_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void pictureBox1_Click_1(object sender, EventArgs e)
{
if (this.isMax == false)
{
// 改变功能栏图片
String imgFunctionPath = Setting.imgDir + @"\功能栏2.png";
Image functionBar = Image.FromFile(imgFunctionPath);
plFunctionBar.BackgroundImage = functionBar;
// 最大化显示系统工具栏
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;
this.MaximumSize = Screen.FromHandle(this.Handle).WorkingArea.Size;
// 保存窗口当前的大小
this.oldSize = this.Size;
// 窗口最大化
this.WindowState = FormWindowState.Maximized;
this.isMax = true;
}
else
{
// 改变功能栏图片
String imgFunctionPath = Setting.imgDir + @"\功能栏.png";
Image functionBar = Image.FromFile(imgFunctionPath);
plFunctionBar.BackgroundImage = functionBar;
// 窗口恢复默认
this.WindowState = FormWindowState.Normal;
this.Size = this.oldSize;
this.isMax = false;
}
}
private void Form1_Load(object sender, EventArgs e)
{
// 播放列表隐藏
plPlaylist.Visible = false;
// 播放列标大小设置
plPlaylist.Size = new Size(382, 803);
// 播放歌曲歌手文本隐藏
lblSongName.Visible = false;
lblSingGerrnName.Visible = false;
// 让首页选中的背景颜色变色
lblHomePage.BackColor = Color.FromArgb(246, 246, 247);
// 隐藏所有
allFormMinimize();
// 显示主界面
plHomePage.Visible = true;
// 平铺
plHomePage.Dock = DockStyle.Fill;
// 初始化 歌单1
initSongList1();
// 初始化 歌单2
initSongList2();
// 初始化 歌单3
initSongList3();
// 初始化 歌单4
initSongList4();
}
private void initSongList3()
{
// 调用帮手
DbHelper helper = new DbHelper();
// 新建 sql 语句
String sql = "select Song.id as songId,Song.name as songName,Album.name as songAlbum,times,Singer.name as songSinger,mp3Path,mvkPath,imgs from Song inner join Album on Song.albumId = Album.id inner join Singer on Song.singerId = Singer.id where Singer.name not in ('周杰伦','刘大壮')";
// 获取数据郎读者
SqlDataReader reader = helper.getReader(sql);
// 循环
while (reader.Read())
{
// 获取对应的值
String songId = reader["songId"].ToString();
String songName = reader["songName"].ToString();
String songAlbumld = reader["songAlbum"].ToString();
String songTimes = reader["times"].ToString();
String songSingerId = reader["songSinger"].ToString();
String songMp3Path = reader["mp3Path"].ToString();
String songMvkPath = reader["mvkPath"].ToString();
String songImg = reader["imgs"].ToString();
// 新建一个listViewItem 对象
ListViewItem item = new ListViewItem();
// 对象赋值
Song s = lineToObject(reader);
// 桥梁赋值
item.Tag = s;
// 对应赋值
item.Text = songName;
item.SubItems.Add(songSingerId);
item.SubItems.Add(songAlbumld);
item.SubItems.Add(songTimes);
// 把item添加进 listView 中
lvSongList3.Items.Add(item);
}
}
private void initSongList2()
{
// 调用帮手
DbHelper helper = new DbHelper();
// 新建 sql 语句
String sql = "select Song.id as songId,Song.name as songName,Album.name as songAlbum,times,Singer.name as songSinger,mp3Path,mvkPath,imgs from Song inner join Album on Song.albumId = Album.id inner join Singer on Song.singerId = Singer.id where Singer.name = '周杰伦'";
// 获取数据朗读者
SqlDataReader reader = helper.getReader(sql);
// 循环
while (reader.Read())
{
// 获取对应的值
String songId = reader["songId"].ToString();
String songName = reader["songName"].ToString();
String songAlbumld = reader["songAlbum"].ToString();
String songTimes = reader["times"].ToString();
String songSingerId = reader["songSinger"].ToString();
String songMp3Path = reader["mp3Path"].ToString();
String songMvkPath = reader["mvkPath"].ToString();
String songImg = reader["imgs"].ToString();
// 新建一个listViewItem 对象
ListViewItem item = new ListViewItem();
// 对象赋值
Song s = lineToObject(reader);
// 桥梁赋值
item.Tag = s;
// 对应赋值
item.Text = songName;
item.SubItems.Add(songSingerId);
item.SubItems.Add(songAlbumld);
item.SubItems.Add(songTimes);
// 把item添加进 listView 中
lvSongList2.Items.Add(item);
}
}
private void initSongList1()
{
// 调用帮手
DbHelper helper = new DbHelper();
// 新建 slq 语句
String sql = "select Song.id as songId,Song.name as songName,Album.name as songAlbum,times,Singer.name as songSinger,mp3Path,mvkPath,imgs from Song inner join Album on Song.albumId = Album.id inner join Singer on Song.singerId = Singer.id where Singer.name = '刘大壮'";
// 获取数据朗读者
SqlDataReader reader = helper.getReader(sql);
// 循环
while (reader.Read())
{
// 获取对应的值
String songId = reader["songId"].ToString();
String songName = reader["songName"].ToString();
String songAlbumld = reader["songAlbum"].ToString();
String songTimes = reader["times"].ToString();
String songSingerId = reader["songSinger"].ToString();
String songMp3Path = reader["mp3Path"].ToString();
String songMvkPath = reader["mvkPath"].ToString();
String songImg = reader["imgs"].ToString();
// 新建一个listViewItem 对象
ListViewItem item = new ListViewItem();
// 对象赋值
Song s = lineToObject(reader);
// 桥梁赋值
item.Tag = s;
// 对应赋值
item.Text = songName;
item.SubItems.Add(songSingerId);
item.SubItems.Add(songAlbumld);
item.SubItems.Add(songTimes);
// 把item添加进 listView 中
lvSongList1.Items.Add(item);
}
}
private void initSongList4()
{
// 调用帮手
DbHelper helper = new DbHelper();
// 新建 slq 语句
String sql = "select Song.id as songId,Song.name as songName,Album.name as songAlbum,times,Singer.name as songSinger,mp3Path,mvkPath,imgs from Song inner join Album on Song.albumId = Album.id inner join Singer on Song.singerId = Singer.id";
// 获取数据朗读者
SqlDataReader reader = helper.getReader(sql);
// 循环
while (reader.Read())
{
// 获取对应的值
String songId = reader["songId"].ToString();
String songName = reader["songName"].ToString();
String songAlbumld = reader["songAlbum"].ToString();
String songTimes = reader["times"].ToString();
String songSingerId = reader["songSinger"].ToString();
String songMp3Path = reader["mp3Path"].ToString();
String songMvkPath = reader["mvkPath"].ToString();
String songImg = reader["imgs"].ToString();
// 新建一个listViewItem 对象
ListViewItem item = new ListViewItem();
// 对象赋值
Song s = lineToObject(reader);
// 桥梁赋值
item.Tag = s;
// 对应赋值
item.Text = songName;
item.SubItems.Add(songSingerId);
item.SubItems.Add(songAlbumld);
item.SubItems.Add(songTimes);
// 把item添加进 listView 中
lvSongList4.Items.Add(item);
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void allFormMinimize()
{
// 让所有的lv 隐藏
lvSearch.Visible = false;
lvSongList1.Visible = false;
lvSongList2.Visible = false;
lvSongList3.Visible = false;
lvSongList4.Visible = false;
// 让首页隐藏
plHomePage.Visible = false;
// 让播放器隐藏
plMedia.Visible = false;
// 让播放列表隐藏
plPlaylist.Visible = false;
}
private void label4_Click(object sender, EventArgs e)
{
// 让所有的lable 文字背景颜色变成白色
allLableBackColor();
// 让选中的背景颜色变色
lblHomePage.BackColor = Color.FromArgb(246, 246, 247);
// 让其他的lv的隐藏
allFormMinimize();
// 让首页显示
plHomePage.Visible = true;
// 平铺
plHomePage.Dock = DockStyle.Fill;
}
private void allLableBackColor()
{
// 让所有的lable恢复默认颜色
lblHomePage.BackColor = Color.FromArgb(255, 255, 255);
lblSongList1.BackColor = Color.FromArgb(255, 255, 255);
lblSongList2.BackColor = Color.FromArgb(255, 255, 255);
lblSongList3.BackColor = Color.FromArgb(255, 255, 255);
lblSongList4.BackColor = Color.FromArgb(255, 255, 255);
}
private void pbSongList4_Click(object sender, EventArgs e)
{
// 隐藏所有
allFormMinimize();
// 显示歌单4
lvSongList4.Visible = true;
//设置平铺
lvSongList4.Dock = DockStyle.Fill;
}
private void lblSongList4_Click(object sender, EventArgs e)
{
// 让所有的lable 文字背景颜色变成白色
allLableBackColor();
// 让选中的背景颜色变色
lblSongList4.BackColor = Color.FromArgb(246, 246, 247);
// 让其他的lv的隐藏
allFormMinimize();
// 让首页显示
lvSongList4.Visible = true;
// 平铺
lvSongList4.Dock = DockStyle.Fill;
}
private void pbSongList1_Click(object sender, EventArgs e)
{
// 隐藏所有
allFormMinimize();
// 显示歌单
lvSongList1.Visible = true;
// 设置平铺
lvSongList1.Dock = DockStyle.Fill;
}
private void plHomePage_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标恢复默认
this.Cursor = Cursors.Default;
}
private void lblSongList1_Click(object sender, EventArgs e)
{
// 让所有的lable 文字背景颜色变成白色
allLableBackColor();
// 让选中的背景颜色变色
lblSongList1.BackColor = Color.FromArgb(246, 246, 247);
// 隐藏所有
allFormMinimize();
// 显示歌单
lvSongList1.Visible = true;
// 设置平铺
lvSongList1.Dock = DockStyle.Fill;
}
private void pbSongList3_Click(object sender, EventArgs e)
{
// 隐藏所有
allFormMinimize();
// 显示歌单
lvSongList3.Visible = true;
// 设置平铺
lvSongList3.Dock = DockStyle.Fill;
}
private void lblSongList3_Click(object sender, EventArgs e)
{
// 让所有的lable 文字背景颜色变成白色
allLableBackColor();
// 让选中的背景颜色变色
lblSongList3.BackColor = Color.FromArgb(246, 246, 247);
// 隐藏所有
allFormMinimize();
// 显示歌单
lvSongList3.Visible = true;
// 设置平铺
lvSongList3.Dock = DockStyle.Fill;
}
private void pbSongList2_Click(object sender, EventArgs e)
{
// 隐藏所有
allFormMinimize();
// 显示歌单
lvSongList2.Visible = true;
// 设置平铺
lvSongList2.Dock = DockStyle.Fill;
}
private void lblSongList2_Click(object sender, EventArgs e)
{
// 让所有的lable 文字背景颜色变成白色
allLableBackColor();
// 让选中的背景颜色变色
lblSongList2.BackColor = Color.FromArgb(246, 246, 247);
// 隐藏所有
allFormMinimize();
// 显示歌单
lvSongList2.Visible = true;
// 设置平铺
lvSongList2.Dock = DockStyle.Fill;
}
private void lblHomePage_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void lblSongList1_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void lblSongList2_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void lblSongList3_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void lblSongList4_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void panel7_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标恢复默认
this.Cursor = Cursors.Default;
}
private void lblKTV_Click(object sender, EventArgs e)
{
// 隐藏所有
allFormMinimize();
// 显示歌单
plHomePage.Visible = true;
// 设置平铺
plHomePage.Dock = DockStyle.Fill;
}
private void lblKTV_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pictureBox6_Click(object sender, EventArgs e)
{
if (isPlayList == false)
{
// 显示播放列表
plPlaylist.Visible = true;
// 改变歌曲列表的状态
isPlayList = true;
}
else
{
// 隐藏播放列表
plPlaylist.Visible = false;
// 改变歌曲列表的状态
isPlayList = false;
}
}
private void butSearch_Click(object sender, EventArgs e)
{
// 获取文本框内容
String txtBox = txtSearch.Text;
// 清空内容
lvSearch.Items.Clear();
if (txtBox.Trim().Length == 0)
{
MessageBox.Show("请输入搜索内容!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
// 隐藏所有
allFormMinimize();
// 显示搜索列表
lvSearch.Visible = true;
// 设置平铺
lvSearch.Dock = DockStyle.Fill;
// 初始化 搜索列表
initSongSearch();
// 判断行数
int i = lvSearch.Items.Count;
if (i == 0)
{
MessageBox.Show("对不起,没有您想要的内容!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
}
private void initSongSearch()
{
// 调用帮手
DbHelper helper = new DbHelper();
// 获取文本框内容
String txtBox = txtSearch.Text;
// 构建 sql 语句
String sql = String.Format("select Song.id as songId,Song.name as songName,Album.name as songAlbum,times,Singer.name as songSinger,mp3Path,mvkPath,imgs from Song inner join Album on Song.albumId = Album.id inner join Singer on Song.singerId = Singer.id where Song.name like '%{0}%' or Singer.name like '%{1}%';", txtBox, txtBox);
// 获取数据朗读者
SqlDataReader reader = helper.getReader(sql);
// 循环
while (reader.Read())
{
// 获取对应的值
String songId = reader["songId"].ToString();
String songName = reader["songName"].ToString();
String songAlbumld = reader["songAlbum"].ToString();
String songTimes = reader["times"].ToString();
String songSingerId = reader["songSinger"].ToString();
String songMp3Path = reader["mp3Path"].ToString();
String songMvkPath = reader["mvkPath"].ToString();
String songImg = reader["imgs"].ToString();
// 新建一个listViewItem 对象
ListViewItem item = new ListViewItem();
// 对象赋值
Song s = lineToObject(reader);
// 桥梁赋值
item.Tag = s;
// 对应赋值
item.Text = songName;
item.SubItems.Add(songSingerId);
item.SubItems.Add(songAlbumld);
item.SubItems.Add(songTimes);
// 把item添加进 listView 中
lvSearch.Items.Add(item);
}
}
private Song lineToObject(SqlDataReader reader)
{
//获取数据
String songId = reader["songId"].ToString();
String songName = reader["songName"].ToString();
String songAlbumld = reader["songAlbum"].ToString();
String songTimes = reader["times"].ToString();
String songSingerId = reader["songSinger"].ToString();
String songMp3Path = reader["mp3Path"].ToString();
String songMvkPath = reader["mvkPath"].ToString();
String songImg = reader["imgs"].ToString();
//实例化一个歌曲对象
Song s = new Song();
s.Id = songId;
s.SongFullNameMp3 = songMp3Path;
s.SongFullName = songMvkPath;
s.SongName = songName;
s.SingerName = songSingerId;
s.AlbumName = songAlbumld;
s.SongTimes = songTimes;
s.SongImge = songImg;
return s;
}
private void lvSongList4_Click(object sender, EventArgs e)
{
}
private void lvSongList1_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void lvSongList2_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void lvSongList3_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void lvSearch_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void lvSongList4_MouseMove(object sender, MouseEventArgs e)
{
// 让鼠标变为默认
this.Cursor = Cursors.Default;
}
private void lvSongList4_DoubleClick(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongList4.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项藏着的歌
Song s = (Song)(lvSongList4.SelectedItems[0].Tag);
// 判断歌曲是否存在
bool isExist = checkExist(Db.playArry, s);
// 判断 b 对象
if (isExist)
{
return;
}
// 把这首歌放到播放列表的对象数组中
ArrayHelper.append(Db.playArry, s);
// 获取这个歌数组的真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
// 同步数据
lblSongNumber.Text = len.ToString();
// 更新播放列表
updatePlayList();
// 获取当前项的数量
int c = lvSongPlayList.Items.Count;
// 当前数量减一
currentIdex = c - 1;
// 播放下一首歌
playMedia();
}
private void updatePlayList()
{
//清空lv
lvSongPlayList.Items.Clear();
//遍历播单数组,有一个数据,就来一个项
foreach (Song s in Db.playArry)
{
//排除掉 null 的情况
if (s == null)
{
break;
}
//有一首歌就来一个项
ListViewItem item = new ListViewItem();
//给想添加属性
item.Text = s.SongName;
item.SubItems.Add(s.SingerName);
item.SubItems.Add(s.SongTimes);
//把项添加进lv里面
lvSongPlayList.Items.Add(item);
}
}
private bool checkExist(Song[] playArry, Song s)
{
//遍历数组
foreach (Song tempSong in playArry)
{
if (tempSong == null)
{
break;
}
//获取当前的歌曲id
String tempId = tempSong.Id;
String sId = s.Id;
//获取id做比较
bool b = tempId.Equals(sId);
//如果b 等于 true
if (b)
{
return true;
}
}
return false;
}
private void 添加进播放列表ToolStripMenuItem_Click(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongList4.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项藏着的歌
Song s = (Song)(lvSongList4.SelectedItems[0].Tag);
// 判断歌曲是否存在
bool isExist = checkExist(Db.playArry, s);
// 判断 b 对象
if (isExist)
{
return;
}
// 把这首歌放到播放列表的对象数组中
ArrayHelper.append(Db.playArry, s);
// 获取这个歌数组的真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
// 同步数据
lblSongNumber.Text = len.ToString();
// 更新播放列表
updatePlayList();
}
private void timer1_Tick(object sender, EventArgs e)
{
// 获取播放列表中歌曲的数量
int i = lvSongPlayList.Items.Count;
// 判断播放列表中是否有数据
if (i > 0)
{
if (isPlay == false)
{
// 改变播放状态
isPlay = true;
// 播放第一首歌
playMedia();
}
}
}
private void playMedia()
{
// 有数组
// 找到歌曲对象需要 用到一个下标
// 当前歌曲下标
// 获取数组真实长度
int i = ArrayHelper.getRealNum(Db.playArry);
// 判断数组下标是否越界
if (currentIdex >= i)
{
currentIdex = 0;
}
// 从播放列表中找到当前对应的歌曲对象
Song currentSong = Db.playArry[currentIdex];
// 非空判断
if (currentSong == null)
{
MessageBox.Show("请在播放列表中添加歌曲!", "提示", MessageBoxButtons.OK);
return;
}
// 从对象获取歌曲的媒体名称 列 七里香.mp3
String songFullName = currentSong.SongFullNameMp3;
// 获取歌手姓名
String singerName = currentSong.SingerName;
// 歌曲姓名
String songName = currentSong.SongName;
// 获取歌曲图片
String songImge = currentSong.SongImge;
// 判断照片是否为空
if (songImge.Equals(""))
{
// 为空 修改成默认图片
songImge = "default.jpg";
}
// 把名称 拼成 路径
// 目录路径 + 媒体名称
String songPath = Setting.mp3Dir + singerName + "\\" + songFullName;
// 同步歌曲图片
String imgPath = Setting.mp3ImgeDir + singerName + "\\" + songImge;
// 获取图片
Image image = Image.FromFile(imgPath);
// 图片赋值
pbSongImage.BackgroundImage = image;
// 歌曲信息赋值
lblSongName.Text = songName;
lblSongName.Visible = true;
// 歌手信息赋值
lblSingGerrnName.Text = singerName;
lblSingGerrnName.Visible = true;
// 播放的功能
// 播放器控件URL=路径
axWindowsMediaPlayer1.URL = songPath;
//
initLvSongColor();
lvSongPlayList.Items[currentIdex].BackColor = Color.FromArgb(0, 120, 215);
}
private void initLvSongColor()
{
// 遍历
foreach (ListViewItem item in lvSongPlayList.Items)
{
item.BackColor = Color.FromArgb(255, 255, 255);
}
}
private void pictureBox3_Click(object sender, EventArgs e)
{
// 获取媒体控件的当前状态
int status = (int)axWindowsMediaPlayer1.playState;
// 判断歌曲是否是在播放
if (status == 3 || status == 2)
{
// 判断歌曲状态是否是暂停
if (status == 2)
{
axWindowsMediaPlayer1.Ctlcontrols.play();
// 让显示内容为暂停
// 获取图片位置
String imgPause = Setting.imgDir + "\\暂停.png";
Image pauseImg = Image.FromFile(imgPause);
// 让图片为暂停的图片
pbPlayAndPause.Image = pauseImg;
// 返回值
return;
}
// 让媒体控件停顿
axWindowsMediaPlayer1.Ctlcontrols.pause();
// 让显示内容为播放
// 获取图片位置
String imgPaly = Setting.imgDir + "\\播放.png";
Image palyImg = Image.FromFile(imgPaly);
// 让图片为暂停的图片
pbPlayAndPause.Image = palyImg;
}
}
private void trIsSongFinish_Tick(object sender, EventArgs e)
{
// 判断当前的歌曲状态
int i = (int)axWindowsMediaPlayer1.playState;
// 获取播放数组真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
if (i >= len)
{
i = 0;
}
if (i == 1)
{
currentIdex++;
playMedia();
}
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
// 前端移除
// 判断选中的行数
int i = lvSongPlayList.SelectedItems.Count;
// 判断选中行数是否为零
if (i == 0)
{
return;
}
// 获取id 通过 id 移除歌曲
int remove = lvSongPlayList.SelectedItems[0].Index;
// 移除
lvSongPlayList.Items.RemoveAt(remove);
// 后端移除
ArrayHelper.pop(Db.playArry, remove);
// 更新数据
updateArryNumber();
}
private void pbNextSong_Click(object sender, EventArgs e)
{
//让播放的下标+1
currentIdex++;
//数据边界判断,上限判断
//获取播放列表的数组中的真实长度 4
//当前下标是否大于等于4,数据校正,
int realNum = ArrayHelper.getRealNum(Db.playArry);
//判断
if (currentIdex >= realNum)
{
currentIdex = 0;
}
//播放下一首
playMedia();
}
private void pbPrev_Click(object sender, EventArgs e)
{
//下标自减
currentIdex--;
//获取真实长度
int realNum = ArrayHelper.getRealNum(Db.playArry);
//边界判断
if (currentIdex < 0)
{
currentIdex = realNum - 1;
}
//播放下一首
playMedia();
}
private void 移除所有歌曲ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 前端移除
// 移除所有歌曲
lvSongPlayList.Items.Clear();
// 后端移除
Db.playArry = new Song[10];
// 更新数据
updateArryNumber();
}
private void updateArryNumber()
{
// 获取数组真实长度
int i = ArrayHelper.getRealNum(Db.playArry);
// 更新lable
lblSongNumber.Text = i.ToString();
}
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
// 判断选中项的个数
int i = lvSongPlayList.SelectedItems.Count;
// 判断
if (i <= 0)
{
return;
}
// 获取当前选中行的下标
int indexItem = lvSongPlayList.SelectedItems[0].Index;
// 保存选中的数据
Song s = Db.playArry[indexItem];
// 移除数据
ArrayHelper.pop(Db.playArry, indexItem);
// 调用 数组工具类 进行添加
ArrayHelper.insert(Db.playArry, 1, s);
// 更新播放列表
updatePlayList();
}
private void lvSongList1_DoubleClick(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongList1.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项藏着的歌
Song s = (Song)(lvSongList1.SelectedItems[0].Tag);
// 判断歌曲是否存在
bool isExist = checkExist(Db.playArry, s);
// 判断 b 对象
if (isExist)
{
return;
}
// 把这首歌放到播放列表的对象数组中
ArrayHelper.append(Db.playArry, s);
// 获取这个歌数组的真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
// 同步数据
lblSongNumber.Text = len.ToString();
// 更新播放列表
updatePlayList();
// 获取当前项的数量
int c = lvSongPlayList.Items.Count;
// 当前数量减一
currentIdex = c - 1;
// 播放下一首歌
playMedia();
}
private void lvSongList2_DoubleClick(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongList2.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项藏着的歌
Song s = (Song)(lvSongList2.SelectedItems[0].Tag);
// 判断歌曲是否存在
bool isExist = checkExist(Db.playArry, s);
// 判断 b 对象
if (isExist)
{
return;
}
// 把这首歌放到播放列表的对象数组中
ArrayHelper.append(Db.playArry, s);
// 获取这个歌数组的真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
// 同步数据
lblSongNumber.Text = len.ToString();
// 更新播放列表
updatePlayList();
// 获取当前项的数量
int c = lvSongPlayList.Items.Count;
// 当前数量减一
currentIdex = c - 1;
// 播放下一首歌
playMedia();
}
private void lvSongList3_DoubleClick(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongList3.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项藏着的歌
Song s = (Song)(lvSongList3.SelectedItems[0].Tag);
// 判断歌曲是否存在
bool isExist = checkExist(Db.playArry, s);
// 判断 b 对象
if (isExist)
{
return;
}
// 把这首歌放到播放列表的对象数组中
ArrayHelper.append(Db.playArry, s);
// 获取这个歌数组的真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
// 同步数据
lblSongNumber.Text = len.ToString();
// 更新播放列表
updatePlayList();
// 获取当前项的数量
int c = lvSongPlayList.Items.Count;
// 当前数量减一
currentIdex = c - 1;
// 播放下一首歌
playMedia();
}
private void lvSearch_DoubleClick(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSearch.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项藏着的歌
Song s = (Song)(lvSearch.SelectedItems[0].Tag);
// 判断歌曲是否存在
bool isExist = checkExist(Db.playArry, s);
// 判断 b 对象
if (isExist)
{
return;
}
// 把这首歌放到播放列表的对象数组中
ArrayHelper.append(Db.playArry, s);
// 获取这个歌数组的真实长度
int len = ArrayHelper.getRealNum(Db.playArry);
// 同步数据
lblSongNumber.Text = len.ToString();
// 更新播放列表
updatePlayList();
// 获取当前项的数量
int c = lvSongPlayList.Items.Count;
// 当前数量减一
currentIdex = c - 1;
// 播放下一首歌
playMedia();
}
private void 添加进歌单3ToolStripMenuItem_Click(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongList2.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中的项
ListViewItem item;
}
private void pbPlayAndPause_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbNextSong_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbPrev_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pictureBox6_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbMV_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbMV_Click(object sender, EventArgs e)
{
// 获取播放状态
int i = (int)axWindowsMediaPlayer1.playState;
// 获取当前播放歌曲对象
Song s = Db.playArry[currentIdex];
if (s == null)
{
MessageBox.Show("对不起本视频没有MV!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
// 判断是否有视频
if (s.SongFullName.Equals(""))
{
MessageBox.Show("对不起本视频没有MV!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
// 隐藏所有
allFormMinimize();
// 显示视频窗口
plMedia.Visible = true;
// 视频窗口平铺
plMedia.Dock = DockStyle.Fill;
// 获取mvk 路径
String mp4Path = s.SongFullName;
// 获取歌手姓名
String singerName = s.SingerName;
// 拼接路径
String mp4FullPath = Setting.mp4Dir + singerName + "\\" + mp4Path;
// 播放视频
axWindowsMediaPlayer1.URL = mp4FullPath;
}
private void lvSongPlayList_DoubleClick(object sender, EventArgs e)
{
//判断选中的行数
int i = lvSongPlayList.SelectedItems.Count;
// 判断选中的行数
if (i == 0)
{
return;
}
// 获取选中行的下标
int indexItem = lvSongPlayList.SelectedItems[0].Index;
currentIdex = indexItem;
playMedia();
}
private void pbSongList1_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbSongList2_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbSongList3_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
private void pbSongList4_MouseMove(object sender, MouseEventArgs e)
{
// 鼠标变成小手
this.Cursor = Cursors.Hand;
}
}
}
其他工具类
主入口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 网易元音乐项目
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
路径位置
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 网易元音乐项目
{
class Setting
{
// 平台界面图片路径
public static String imgDir = @"ziliao\前端";
// 歌曲MP3路径
public static String mp3Dir = @"D:\KTV资源管理\mp3\";
// 歌曲图片路径
public static String mp3ImgeDir = @"D:\KTV资源管理\img\";
// 歌曲Mp4路径
public static String mp4Dir = @"D:\KTV资源管理\mp4\";
}
}
播放列表对象数组
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 网易元音乐项目
{
class Db
{
//播放列表的对象数组
public static Song[] playArry = new Song[10];
}
}
提供共有方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 网易元音乐项目
{
class Song
{
//歌手id
private String id;
public String Id
{
get { return id; }
set { id = value; }
}
//歌曲路径全名
private String songFullNameMp3;
public String SongFullNameMp3
{
get { return songFullNameMp3; }
set { songFullNameMp3 = value; }
}
//MV路径全名
private String songFullName;
public String SongFullName
{
get { return songFullName; }
set { songFullName = value; }
}
//歌曲姓名
private String songName;
public String SongName
{
get { return songName; }
set { songName = value; }
}
//歌手姓名
private String singerName;
public String SingerName
{
get { return singerName; }
set { singerName = value; }
}
//专辑名称
private String albumName;
public String AlbumName
{
get { return albumName; }
set { albumName = value; }
}
//歌曲时长
private String songTimes;
public String SongTimes
{
get { return songTimes; }
set { songTimes = value; }
}
// 歌曲封面
private String songImge;
public String SongImge
{
get { return songImge; }
set { songImge = value; }
}
}
}
数据库连接工具类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace 网易元音乐项目
{
class DbHelper
{
// 连接字符串
public String connStr = "Data Source=.;Initial Catalog=KTV1107;Integrated Security=True";
// 获得连接对象
public SqlConnection getConn() {
//获取连接对象
SqlConnection conn = new SqlConnection(this.connStr);
//打开连接
conn.Open();
//返回值
//返回连接对象
return conn;
}
// 增删改方法
// 返回受影响行数
public int update(String sql) {
// 连接对象
SqlConnection conn = getConn();
// 执行者
SqlCommand cmd = new SqlCommand(sql,conn);
// int i = 执行者.执行不查询()
int i = cmd.ExecuteNonQuery();
//返回值
//返回受影响行数
return i;
}
// 查询方法
// 返回数据朗读者
public SqlDataReader getReader (String sql) {
// 连接对象
SqlConnection conn = getConn();
// 执行者
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sql;
cmd.Connection = conn;
// 执行者.executeReader()----》数据朗读者
SqlDataReader reader = cmd.ExecuteReader();
//返回值
//返回数据朗读者
return reader;
}
// 获取断开式的表
public DataTable getTable(String sql)
{
//获取连接对象
SqlConnection conn = getConn();
//获取仓库
DataSet ds = new DataSet();
//数据小车
SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
//小车卸货
adapter.Fill(ds,"table");
//获取数据表
DataTable dt = ds.Tables["table"];
//返回值
//返回数据表
return dt;
}
//获取仓库
public DataSet getDataSet(String sql)
{
//获取连接对象
SqlConnection conn = getConn();
//获取仓库
DataSet ds = new DataSet();
//获取数据小车
SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
//小车卸货
adapter.Fill(ds,"table");
//返回值
//返回仓库
return ds;
}
}
}
数组工具类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 网易元音乐项目
{
class ArrayHelper
{
// 求数组真实长度
public static int getRealNum(Object[] objs) {
// 定义一个计数器
int len = 0;
// 遍历数组,获得下标
for (int i = 0; i < objs.Length; i++)
{
// i就是下标
// 获取下标对应的值
object item = objs[i];
// 判断非法
if (item == null) {
break;
}
// 合法情况
len++;
}
return len;
}
// 未位添加算法
public static void append(Object[] objs,object obj) {
// 获取数据
int realNum = getRealNum(objs);
int length = objs.Length;
// 非法判断
if (realNum == length) {
return;
}
// 主要逻辑
objs[realNum] = obj;
}
// 未位删除
public static object pop(Object[] objs) {
// 获取相关数据
int realNum = getRealNum(objs);
// 非法情况
if (realNum == 0) {
return null;
}
// 主逻辑
// 计算最后一个成员的下标
int lastIdx = realNum - 1;
// 拿到这个下标对应的值
object obj = objs[lastIdx];
// 把最后一个成员的下标对应位置设置为null
objs[lastIdx] = null;
// 返回这个值
return obj;
}
// 中部插入算法
public static void insert(Object[] objs, int insertIndex, Object obj) {
// 获取相关数据
int realNum = getRealNum(objs);
// 非法验证
if (insertIndex >= realNum) {
return;
}
if (realNum == objs.Length) {
return;
}
// 主逻辑
// 1,数据后移
int lastIdx = realNum - 1;
for (int i = lastIdx; i >= insertIndex; i--)
{
// i代表要操做的下标了
Object o = objs[i];
objs[i + 1] = o;
}
// 2,数据填入
objs[insertIndex] = obj;
}
// 中部删除
public static object pop(Object[] objs,int delIndex) {
// 获取相关数据
int realNum = getRealNum(objs);
// 非法验证
if (delIndex >= realNum) {
return null;
}
// get del item
object delItem = objs[delIndex];
// 主逻辑
// 1,位移
int lastIndex = realNum - 1; // 最后一个数据的下标
for (int i = delIndex; i <= lastIndex-1; i++)
{
// i代表了要操做的下标
// 获取下一个下标对应的值
object o = objs[i + 1];
objs[i] = o;
}
// 2,设空
// 设置最后一个成员的位置,让它变为null
objs[lastIndex] = null;
// 返回数据
return delItem;
}
}
}