首页 > 代码库 > C#作业总结(3)

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

其他的就没有什么了。

 

C#作业总结(3)