C#作业总结(3)

接着上面的总结,这部分准备详细的分析一下音乐播放器,当然这里不分析歌词部分,网上完整的代码地址 http://download.csdn.net/detail/zhoupeng39/8256843

先给出程序的运行图片

我打算分为一下几个部分

1.增加音乐-----歌词列表显示

2.皮肤更换(更换背景图片)

3.音乐播放Windows Media Player使用

忘了说了,源程序在播放音乐和歌词检索的时候使用了多线程。

一。增加音乐

        private  string[] m_names;          //保存路径
        private int m_CurrentPage = 1;      //当前页数
        //增加按钮的响应
        private void pictureBoxAdd_Click(object sender, EventArgs e)
        {
            string[] oldFile;                  //保存以前的路径
            string[] newFile;                  //排序 清除重复之后的路径
            OpenFileDialog of = new OpenFileDialog();
            of.InitialDirectory = "c:\\";       //默认目录
            of.Filter = "mp3|*.mp3|wav|*.wav";  //文件格式
            of.RestoreDirectory = true;         //保存选中历史目录
            of.FilterIndex = 1;
            of.Multiselect = true;             //可以多选
            if (of.ShowDialog() == DialogResult.OK)
            {
                int k = 0;
                int same = 0;                   //记录相同数量
                //第一次增加
                if (m_names == null)
                {
                    oldFile = new string[of.FileNames.Length];  //分配空间
                    foreach (var i in of.FileNames)
                    {
                        oldFile[k] = i;
                        k++;  //保存旧的路径
                    }
                }
                else
                {
                    oldFile = new string[of.FileNames.Length + m_names.Length];  //分配空间
                    for (int y = 0; y < m_names.Length; y++)
                    {
                        oldFile[k] = m_names[y];
                        k++;
                    }
                    foreach (var i in of.FileNames)
                    {
                        oldFile[k] = i;
                        k++;  //保存旧的和新的路径

                    }
                }
                //计算重复的数量
                for (int i = 0; i < oldFile.Length; i++)
                {
                    for (int j = i + 1; j < oldFile.Length; j++)
                    {
                        if (oldFile[i] == oldFile[j])
                        {
                            same++;
                        }
                    }
                }
                //重复的置空
                for (int i = 0; i < oldFile.Length; i++)
                {
                    for (int j = i + 1; j < oldFile.Length; j++)
                    {
                        if (oldFile[i] == oldFile[j])
                        {
                            oldFile[i] = "null";
                        }
                    }
                }
                //消除重复歌曲
                int w = 0;
                newFile = new string[oldFile.Length - same];
                for (int i = 0; i < oldFile.Length; i++)
                {
                    if (oldFile[i] != "null")
                    {
                        newFile[w] = oldFile[i];
                        w++;
                    }
                }
                m_names = newFile;  //保存
            }
            //设置列表
            setMusicList(m_CurrentPage);
        }

        private string getFileName(string path)
        {
            //返回路径
            return System.IO.Path.GetFileNameWithoutExtension(path);
        }

        private void setMusicList(int page)
        {
            int pages = 1;   //歌曲列表页数 每页5首
            int index = 0;   //下标
            int noMusic;     //取摸剩下的没有的歌曲

            if (m_names != null)
            {
                labelSongNums.Text = m_names.Length.ToString();
                Song1.Text = null;
                Song2.Text = null;
                Song3.Text = null;
                Song4.Text = null;
                Song5.Text = null;
                pages = (int)m_names.Length / 5;  //页数
                index = (page - 1) * 5;           //当前索引
                noMusic = m_names.Length % 5;     //最后一页的歌曲的个数
                try
                {
                    Song1.Text = getFileName(m_names[index + 0]);   //填充
                    Song2.Text = getFileName(m_names[index + 1]);
                    Song3.Text = getFileName(m_names[index + 2]);
                    Song4.Text = getFileName(m_names[index + 3]);
                    Song5.Text = getFileName(m_names[index + 4]);
                }
                catch (Exception)
                {

                }
                labelPageCount.Text = (m_names.Length / 5 + 1).ToString();  //总页数计算
            }
        }

二。皮肤更换部分

1.首先这一块使用Panel控件,这里使用了一张有透明通道的背景图片,直接做出了效果,之前没想过

2.然后在里面添加PictureBox控件,然后增加图片,增加图片点击的事件

3.正常情况下隐藏该部分,点击Skin时显示该部分

代码如下

        private bool m_picEnter = false;   //增加了鼠标移入移出图片出现边框的效果
        private void pictureBox1_MouseEnter(object sender, EventArgs e)
        {
            m_picEnter = true;
            PictureBox pic = sender as PictureBox;
            pic.Invalidate();       //重绘
        }
        private void pictureBox1_MouseLeave(object sender, EventArgs e)
        {
            m_picEnter = false;
            PictureBox pic = sender as PictureBox;
            pic.Invalidate();
        }
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            PictureBox pic = sender as PictureBox;
            Rectangle rect=pic.ClientRectangle;   //获取绘制区域
            if (m_picEnter)
            {
                e.Graphics.FillRectangle(new SolidBrush(Color.Silver), rect);         //绘制边框
                e.Graphics.DrawImage(pic.BackgroundImage, new Rectangle(rect.Left + 2, rect.Top + 2, rect.Width - 4, rect.Height - 4)); //绘制图片
            }
            else
                e.Graphics.DrawImage(pic.BackgroundImage, rect); //直接绘制图片
        }
        // 点击部分 更换 背景
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            PictureBox pic = sender as PictureBox;
            this.BackgroundImage = pic.BackgroundImage;  //直接更换背景图片
        }

        //选择背景图片部分
        private string picfile;     //保存copy源
        private string picName;
        private void pictureBox6_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(".\\Background") == false)   //检查背景文件夹是否存在
            {
                Directory.CreateDirectory(".\\Background");  //创建背景文件
                OpenFileDialog of1 = new OpenFileDialog();
                of1.InitialDirectory = "c:\\";
                of1.Filter = "png|*.png|jpg|*.jpg|bmp|*.bmp";
                of1.RestoreDirectory = true;
                of1.FilterIndex = 1;
                if (of1.ShowDialog() == DialogResult.OK)
                {
                    picfile = of1.FileName;         //获取文件路径
                    picName = of1.SafeFileName;
                    try
                    {
                        File.Copy(picfile, string.Format("Background\\{0}", picName, true));  //将选择的图片放到背景文件夹里面
                    }
                    catch (Exception)
                    {
                    }
                    this.BackgroundImage = Image.FromFile(string.Format("Background\\{0}", picName));  //设置背景图片
                }
            }
            else
            {
                OpenFileDialog of = new OpenFileDialog();   //直接打开
                of.InitialDirectory = "c:\\";
                of.Filter = "png|*.png|jpg|*.jpg|bmp|*.bmp";
                of.RestoreDirectory = true;
                of.FilterIndex = 1;
                if (of.ShowDialog() == DialogResult.OK)
                {
                    picfile = of.FileName;
                    picName = of.SafeFileName;
                    try
                    {
                        File.Copy(picfile, string.Format("Background\\{0}", picName, true));    //存储
                    }
                    catch (Exception)
                    {
                    }
                    this.BackgroundImage = Image.FromFile(string.Format("Background\\{0}", picName));  //设置
                }
            }
            panelSkin.Visible = false;  //皮肤容器消失
        }

三。Windows Media Player控件的使用

关于这个播放器的使用,我不想说什么,直接给出相关代码

        public void getmusicTime()
        {
            thistime = this.axWindowsMediaPlayer1.Ctlcontrols.currentPosition;   //当前位置
            alltime = this.axWindowsMediaPlayer1.currentMedia.duration;          //所有时间
            bfb = thistime / alltime;    //比例
            thisX = 310 * bfb;           //白色的长度
            panelProgressUp.Size = new Size((int)thisX, 3);
        }
        public void play(string namepath)
        {
            this.axWindowsMediaPlayer1.URL = namepath;                       //设置路径
            labelMusic.Text = this.axWindowsMediaPlayer1.currentMedia.name;  //获取音乐名称
            getNum();                                                        //标题移动  获取基本参数
            m_IsPlay = true;
            timer3.Enabled = true;
            getmusicTime();
            if (m_IsPlay)
            {
                pictureBoxPause.BackgroundImage = ImgElementPlay[0];         //设置播放图片
            }
        }

其实这个程序的核心在歌词部分,但是不得不说能用简单的控件做出这样的效果还是很不错的,至少我用MFC是要花很长时间才能写出来。

歌词部分我也看了,难点在

1.LRC文件的解析(每一行有对应的显示时间和歌词)

2.从网站获取歌词  这部分要分析从网站反馈回来的歌词流,其实看看还是能看懂的

其他的就没有什么了。

时间: 2024-10-07 05:45:33

C#作业总结(3)的相关文章

软件工程——第二次作业(2)

施工中-- 作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922 项目要求是编写出一个拥有"词频统计"功能的小程序,作为一个小程序,若只是实现基本的词频统计功能,其实并不是很难.但是,如果再附加一些需求和功能的话就会让我感到有点难度了,更何况为了以后课程的要求,我选择使用Visual Studio 2015编译器和C#语言这两种从未学过的工具,在4-5天之内共10个小时左右(预计,但是实际上确实是花了更多时间

2017282110285--第一次个人作业

第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 其实我从高一就开始接触编程了,在高中我搞了两年的算法竞赛,算是有一点算法基础(捂脸,其实实力弱得一批),也是在那个时候开始爱上了编程.因此在高考结束后就报了信息安全专业,哪怕那时候父母不是很支持我报跟计算机相关的专业.我认为我的起步条件会比一般的零基础的萌新稍微好那么一点点,但也就仅限于此了,毕竟有天赋的人比比皆是,他们只是缺少一个契机罢了,入门之后分分钟起飞的也是一大把,更不用说那些大牛博主了,他们的程序员

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

团队编程项目作业

团队名称: 简单 队长 学号:2015035107224 姓名:张志鹏 成员 学号:2015035107071 姓名:邱阳阳 学号:2015035107044 姓名:刘孝东 学号:2015035107007 姓名:孙弘原 学号:2015035107005 姓名:刘文帅 学号:2015035107009 姓名:杨琳 团队编程项目作业名称:爬取豆瓣电影TOP250 选择该团队编程项目原因:感觉项目有意思

团队项目编程作业

团队名称: 简单 队长 学号:2015035107224 姓名:张志鹏 成员 学号:2015035107071 姓名:邱阳阳 学号:2015035107044 姓名:刘孝东 学号:2015035107007 姓名:孙弘原 学号:2015035107005 姓名:刘文帅 学号:2015035107009 姓名:杨琳 团队编程项目作业名称:爬取豆瓣电影TOP250 选择该团队编程项目原因:我爱学习

团队作业八——第二次团队冲刺(Beta版本)第6天

团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题文件写入. (3) 工作中遇到的困难 今天花了较多时间在完善登录注册界面上,这让我们比较担心,如果每天都花很多时间在解决之前的问题,当天的任务又做不好,会不会赶不上进度.如果每天都不能正常完美的完成每天任务,那冲刺最后一天结束的时候,又哪里再有一个明天给我们完善代码.且今天还遇到了写入SD存储卡文件

第四周作业(汇总)

本周作业: 1.对四则运算软件需求的获取方式进行实践,例如使用调查问卷访问相关关系人等. 答: 本次是借助“问卷星”网站来发布问卷进行调查的.问卷地址:https://sojump.com/jq/9942880.aspx 本次问卷针对学生.家长和老师三个对象进行调查,对 四则软件进行需求分析.问卷调查结束后,问卷星还提供数据分析服务. 2.采用四象限法将你小组的四则运算软件的需求功能进行分类.阐述其优势与不足. 3.尝试把四则运算软件需求进行分解,变为每个小组成员可执行的积压工作项,分配这些工作

个人作业-Week3:代码复审

软件工程师的成长 我在上大学之前,对于软件工程师之类并无概念,并且高初中的电脑课也从未提及过写代码之类的东西,更多的都是一些教一些办公软件的使用(笑,明明电脑课总是因为老师“有事”变成其他课,根本就没上过几节吧),来到大学后得知一些同学高中就开始搞各种竞赛后,我感到十分惊讶,什么,从小热爱学习XX,一路坚持,最终成为XX大师的人小说以外真的有啊.大学之后的课余时间更是鲜有与软件工程相挂钩的事情,用一句话概括,就是过着这些博主批判对象的生活,十分尴尬.选这个课就是觉得应该做出些改变了,然而在第一次

z作业二总结

这是我的第二次作业,之前在课上所学的我发现已经忘得差不多了,这次的作业让我做的非常累,感觉整个人生都不太好了. 作业中的知识点:int(整型) float(单精度) double(双精度) char(字符型) 任何变量都必须先定义后使用 变量=表达式注:左边必须是单个变量 printf—格式控制字符 普通字符:原样输出. 格式控制说明:按指定的格式输出数据,与数据类型有关 >:大于 <:小于 <=,>=小于等于,大于等于 ==:等于 !=:不等于 实验中遇到的困难:知识点基本上都忘

第四周作业

第四周作业 1.复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. (1)复制/etc/skel目录为/home/tuser1 [[email protected] ~]# cp -r /etc/skel/ /home [[email protected] ~]# mv /home/skel /home/tuser1 [[email protected] ~]# ll -a /home/tuser1/ total 2