zoukankan      html  css  js  c++  java
  • C#、.NET迷你音乐播放器


    闲来没事自己做了一个基于WindowsMediaPlayer的迷你音乐播放器,界面如下图

    功能简介:

    1、循环模式:顺不播放

    axWMusicPlayer.settings.setMode("shuffle", false);
    

    全部循环

    axWMusicPlayer.settings.setMode("loop", true);
    

    随机播放

    axWMusicPlayer.settings.setMode("shuffle", true);
    

    2、模拟定时关机

        程序写到定时关机,具体的调用定时关机程序省略了,程序中相应地方有注解。

    定时关机代码
     1 private void 关机时间toolStripTextBox_KeyPress(object sender, KeyPressEventArgs e)
    2 {
    3 if (e.KeyChar == (char)Keys.Enter && 关机时间toolStripTextBox.Text != "")
    4 {
    5 try
    6 {
    7 DateTime time = DateTime.Parse(关机时间toolStripTextBox.Text);
    8 TimeSpan span = new TimeSpan(time.Hour, time.Minute, 0);
    9 if (span.CompareTo(new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, 0)) == 0) //当前关机时间
    10 {
    11 if (MessageBox.Show("你设定的关机时间是当前计算机时间,是否直接关机?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.OK)
    12 {
    13 MynotifyIcon.Icon = Icon.ExtractAssociatedIcon(PathBase + "\\Images\\" + "ShutDown_notifyIcon.ico");
    14 //
    15 //调用关机程序
    16 //
    17 }
    18 else
    19 {
    20 return;
    21 }
    22 }
    23 if (span.CompareTo(new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, 0)) < 0) //过去关机时间
    24 {
    25 MessageBox.Show("此时间已是过去时间,设定无效", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    26 return;
    27 }
    28 if (span.CompareTo(new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, 0)) > 0) //有效关机时间
    29 {
    30
    31 ShutDownTime = 关机时间toolStripTextBox.Text;
    32 MessageBox.Show("成功设置定时关机,计算机将于“" + ShutDownTime + "”关机…… *︶︵︶*", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    33 this.关机时间toolStripTextBox.Visible = false;
    34 this.取消定时关机QToolStripMenuItem.Visible = true;
    35
    36 //
    37 //调用关机程序
    38 //
    39 }
    40 }
    41 catch
    42 {
    43 MessageBox.Show("日期格式不正确,请重新输入。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    44 return;
    45 }
    46 }
    47 if (e.KeyChar == (char)Keys.Enter && 关机时间toolStripTextBox.Text == "")
    48 {
    49 关机时间toolStripTextBox.Visible = false;
    50 }
    51 }

    3、歌曲列表信息保存在XML文件中

    添加歌曲保存代码
     1 private void btnList_Click(object sender, EventArgs e) //添加歌曲
    2 {
    3 openFileDialog1.Title = "添加歌曲";
    4 openFileDialog1.FileName = "";
    5 openFileDialog1.Multiselect = true;
    6 openFileDialog1.Filter = "Mp3文件|*.mp3|Wav文件|*.wav|Wma文件|*.wma|Wmv文件|*.wmv|所有格式|*.*";
    7 openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
    8 try
    9 {
    10 if (openFileDialog1.ShowDialog() == DialogResult.OK)
    11 {
    12 //IsCreateXmlFile();
    13 XmlDocument xmldoc = new XmlDocument();
    14 xmldoc.Load(xmlfile);
    15 XmlNode root = xmldoc.SelectSingleNode("MusicList");
    16 string[] FileNamesList = openFileDialog1.FileNames;
    17 foreach (string file in FileNamesList)
    18 {
    19 string filename= Path.GetFileName(file).Substring(0,Path.GetFileName(file).LastIndexOf('.'));
    20 axWMusicPlayer.currentPlaylist.appendItem(axWMusicPlayer.newMedia(file));
    21 XmlElement newelement = xmldoc.CreateElement("MusicProperty");
    22 newelement.SetAttribute("MusicUrl", file);
    23 newelement.SetAttribute("MusicName", filename);
    24 newelement.SetAttribute("LikeCount", "0");
    25 root.AppendChild(newelement);
    26 Application.DoEvents();
    27 }
    28 xmldoc.Save(xmlfile);
    29 }
    30 }
    31 catch(Exception ex)
    32 {
    33 MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    34 }
    35 }

    4、主界面上的喜爱按钮实现的是歌曲排列顺序

        在下次启动程序后,程序会自动将喜爱点击次数多的歌曲排到前面

    喜爱按钮事件
     1 private void btnFavorite_Click(object sender, EventArgs e) //喜爱
    2 {
    3 if (axWMusicPlayer.currentMedia != null)
    4 {
    5 XmlDocument doc = new XmlDocument();
    6 doc.Load(xmlfile);
    7 XmlNodeList nodelist = doc.SelectSingleNode("MusicList").ChildNodes;
    8 foreach (XmlNode node in nodelist)
    9 {
    10 XmlElement element = (XmlElement)node; //将XmlNode节点node转化成XmlElement型的node
    11 if (element.GetAttribute("MusicUrl") == axWMusicPlayer.currentMedia.sourceURL)
    12 {
    13 int likecount = Convert.ToInt32(element.GetAttribute("LikeCount")) + 1;
    14 element.SetAttribute("LikeCount", likecount.ToString());
    15 }
    16 }
    17 doc.Save(xmlfile);
    18 }
    19 }

    5、点击进度条歌曲直接跳到当前位置继续播放

        设置当前播放位置

    private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    axWMusicPlayer.Ctlcontrols.currentPosition = e.X * axWMusicPlayer.currentMedia.duration / 170;
                }
            }
    

      注解:170为进度条总长度

    6、进度条采用自定义控件

      

    自定义进度条控件代码
     1 /// <summary> 
    2 /// 迷你音乐播放器
    3 /// <author>
    4 ///<name>漓江烟雨</name>
    5 ///<QQ>648445213</QQ>
    6 ///<date>2011.12.3</date>
    7 /// </author>
    8 /// </summary>
    9
    10
    11 namespace UCCurrentTime
    12 {
    13 public partial class UserControl1 : UserControl
    14 {
    15 /// <summary>
    16 /// 设置或获取当前播放进度条的宽度
    17 /// </summary>
    18 public int UCTime
    19 {
    20 get { return this.Width; }
    21 set
    22 {
    23 if (this.Width >= 16)
    24 {
    25 this.Width = value;
    26 }
    27 else
    28 {
    29 this.Width = value + 16;
    30 }
    31
    32 }
    33 }
    34
    35 /// <summary>
    36 /// 设置或获取当前播放进度条左边背景图片
    37 /// </summary>
    38 public Image LeftBackImage
    39 {
    40 get { return picBoxLeft.BackgroundImage; }
    41 set { picBoxLeft.BackgroundImage = value; }
    42 }
    43
    44 /// <summary>
    45 /// 设置或获取当前播放进度条右边背景图片
    46 /// </summary>
    47 public Image RightBackImage
    48 {
    49 get { return picBoxRight.BackgroundImage; }
    50 set { picBoxRight.BackgroundImage = value; }
    51 }
    52
    53 /// <summary>
    54 /// 设置或获取当前播放进度条中间背景图片
    55 /// </summary>
    56 public Image MiddleBackImage
    57 {
    58 get { return picBoxMiddle.BackgroundImage; }
    59 set { picBoxMiddle.BackgroundImage = value; }
    60 }
    61 public UserControl1()
    62 {
    63 InitializeComponent();
    64
    65 picBoxLeft.Size = new Size(8, 10); //左边
    66 picBoxRight.Size = new Size(8, 10); //右边
    67 picBoxMiddle.Size = new Size(0, 10); //中间
    68
    69 picBoxLeft.Dock = DockStyle.Left;
    70 picBoxRight.Dock = DockStyle.Right;
    71 picBoxMiddle.Width = this.Width - 16;
    72 picBoxMiddle.Location = new Point(8, 0);
    73
    74 this.BackColor = Color.Transparent;
    75 picBoxLeft.BackColor = Color.Transparent;
    76 picBoxRight.BackColor = Color.Transparent;
    77 picBoxMiddle.BackColor = Color.Transparent;
    78
    79 picBoxLeft.BackgroundImage = LeftBackImage;
    80 picBoxRight.BackgroundImage = RightBackImage;
    81 picBoxMiddle.BackgroundImage = MiddleBackImage;
    82 }
    83
    84 private void UserControl1_SizeChanged(object sender, EventArgs e)
    85 {
    86 this.Size = new Size(UCTime, 10);
    87 picBoxMiddle.Width = this.Width - 16;
    88 }
    89 }
    90 }

      timer_tick事件

    timer_tick事件代码
     1 private void timer1_Tick(object sender, EventArgs e)
    2 {
    3 try
    4 {
    5 if (axWMusicPlayer.currentMedia != null)
    6 {
    7 if (axWMusicPlayer.currentMedia.name.Length > 9)
    8 {
    9 lblMusicName.Text = axWMusicPlayer.currentMedia.name.Substring(0, 9) + "...";
    10 }
    11 else
    12 {
    13 lblMusicName.Text = axWMusicPlayer.currentMedia.name;
    14 }
    15 lblcurrenttime.Text = axWMusicPlayer.Ctlcontrols.currentPositionString + " / " + axWMusicPlayer.currentMedia.durationString;
    16 UCcurrenttime = Convert.ToInt32(axWMusicPlayer.Ctlcontrols.currentPosition / axWMusicPlayer.currentMedia.duration * 170);
    17 if (UCcurrenttime <= 16)
    18 {
    19 UCcurrenttime = 16;
    20 }
    21 this.userControl11.Width = UCcurrenttime;
    22 }
    23 }
    24 catch
    25 {
    26 return;
    27 }
    28 }

      this.userControl11.Width = UCcurrenttime; 设置进度条长度

    7、由于去掉了默认的标题框所以自己添加了鼠标拖动事件

    鼠标拖动窗体代码
    private void MiniMusicPlayer_MouseDown(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    FormPositioX = e.X;
    FormPositioY = e.Y;
    }
    }

    private void MiniMusicPlayer_MouseMove(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    this.Left += e.X - FormPositioX;
    this.Top += e.Y - FormPositioY;
    }
    }

    8、检测窗体位置,超出了屏幕范围会自动靠边

    处理窗体被拖动到屏幕外
     1 private void MiniMusicPlayer_MouseUp(object sender, MouseEventArgs e)
    2 {
    3 if (this.Left <= 0)
    4 {
    5 this.Left = 0;
    6 }
    7 if (this.Top <= 0)
    8 {
    9 this.Top = 0;
    10 }
    11
    12 int ScreenEidth = Screen.GetWorkingArea(this).Width; //获得屏幕的宽
    13 int ScreenGeight = Screen.GetWorkingArea(this).Height; //获得屏幕的高
    14 if (this.Left + this.Width >= ScreenEidth)
    15 {
    16 this.Left = ScreenEidth - this.Width;
    17 }
    18 if (this.Top + this.Height >= ScreenGeight)
    19 {
    20 this.Top = ScreenGeight - this.Height;
    21 }
    22 }

    9、组合键控制音量,默认音量为70

    控制音量代码
     1 private void MiniMusicPlayer_KeyDown(object sender, KeyEventArgs e) //接收组合键调节音量
    2 {
    3 if ((e.Control) && (e.Alt) && (e.KeyCode == Keys.Up))
    4 {
    5 if (axWMusicPlayer.settings.volume >= 100)
    6 {
    7 axWMusicPlayer.settings.volume = 100;
    8 }
    9 else
    10 {
    11 axWMusicPlayer.settings.volume += 5;
    12 }
    13 }
    14 if (e.Control && e.Alt && (e.KeyCode == Keys.Down))
    15 {
    16 if (axWMusicPlayer.settings.volume <= 0)
    17 {
    18 axWMusicPlayer.settings.volume = 0;
    19 }
    20 else
    21 {
    22 axWMusicPlayer.settings.volume -= 5;
    23 }
    24 }
    25 }

    10、跟据点击喜爱次数填充播放列表

    按喜爱次数自动填充播放列表
     1 /// <summary>
    2 /// 填充播放列表
    3 /// </summary>
    4 protected void FillCurrenrList()
    5 {
    6 XmlDocument doc = new XmlDocument();
    7 doc.Load(xmlfile);
    8 if (doc.SelectSingleNode("MusicList").ChildNodes.Count != 0)
    9 {
    10 XmlNodeList NodeList = doc.SelectSingleNode("MusicList").ChildNodes;
    11 string[] musiclist = new string[doc.SelectSingleNode("MusicList").ChildNodes.Count]; //每条MusicProperty组成一维数组
    12 int num = 0;
    13 foreach (XmlNode node in NodeList)
    14 {
    15 XmlElement element = (XmlElement)node;
    16 musiclist[num] = element.GetAttribute("MusicUrl") + ";" + element.GetAttribute("LikeCount");
    17 num++;
    18 }
    19
    20 string[,] musiclist2 = new string[num, 2]; //将一维数组分割为二维数组:MusicUrl、LikeCount
    21 for (int i = 0; i < num; i++)
    22 {
    23 string[] hh = musiclist[i].Split(';');
    24 musiclist2[i, 0] = hh[0];
    25 musiclist2[i, 1] = hh[1];
    26 }
    27
    28 string temp;
    29 for (int i = 0; i < num - 1; i++) //按点击次数冒泡排序,排序后的数组添加到axWMusicPlayer.currentPlaylist
    30 {
    31 for (int j = 0; j < num - 1 - i; j++)
    32 {
    33 if (Convert.ToInt32(musiclist2[j, 1]) < Convert.ToInt32(musiclist2[j + 1, 1]))
    34 {
    35 temp = musiclist2[j, 1];
    36 musiclist2[j, 1] = musiclist2[j + 1, 1];
    37 musiclist2[j + 1, 1] = temp;
    38
    39 temp = musiclist2[j, 0];
    40 musiclist2[j, 0] = musiclist2[j + 1, 0];
    41 musiclist2[j + 1, 0] = temp;
    42 }
    43 }
    44 }
    45
    46 for (int i = 0; i < num; i++) //填充播放列表
    47 {
    48 axWMusicPlayer.currentPlaylist.appendItem(axWMusicPlayer.newMedia(musiclist2[i, 0]));
    49 }
    50 }
    51 }

     帮助窗口中的一些说明:

     VS2008版:

    源代码下载地址

    VS2010版:

    源代码下载地址

    申明一下:本人现在不从事软件开发了,所以加我QQ的就免了吧,很久没碰了,现在都忘了,非常抱歉没能帮到大家……(2013.3.2)

  • 相关阅读:
    fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
    SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
    FTP 服务搭建后不能访问问题解决
    指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
    svn Please execute the 'Cleanup' command. 问题解决
    .net 操作MongoDB 基础
    oracle 使用绑定变量极大的提升性能
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  • 原文地址:https://www.cnblogs.com/lijiangyanyu/p/2280582.html
Copyright © 2011-2022 走看看