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.从网站获取歌词  这部分要分析从网站反馈回来的歌词流,其实看看还是能看懂的

其他的就没有什么了。

 

posted @ 2014-12-13 23:06  the yesterday  阅读(180)  评论(0编辑  收藏  举报