前言:项目是c#的winform 写的,使用的播放器是基于AxWindowsMediaPlayer。

AxWindowsMediaPlayer的方法

1.1 首先新建一个页面 如图所示: 图片左侧是列表 使用listview 右侧是背景图片。图片框框的地方是后面可以实现的,+和-按钮分别代表添加文件和删除文件 还有就是控制播放的顺序。下面的分别是修改歌词的字体 和展示/隐藏

1.2 新建一个透明的歌词页面[窗体]

1.3 新建一个半透明的页面[窗体]

1.4 业务代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WMPLib;
using System.Media;
using System.IO;
using System.Text.RegularExpressions;
using AxWMPLib;
using System.Drawing.Drawing2D;
using CCWin;namespace KenMusicPlayer
{public partial class MusicPlayer : Skin_DevExpress{public int index = 1;public int listIndex;private bool first_in = true;   //是否第一次进入歌词区域private bool showLrc = true;//默认显示歌词private int imageInd = 0;//播放的图片下标private List<string> imageList;//播放的图片private Point closePoint;//关闭按钮的位置private Size dfSize;//最初的位置//声音SoundPlayer player = new SoundPlayer();Dictionary<string, string> dic = new Dictionary<string, string>();//播放列表Dictionary<string, IWMPMedia> playListDict = new Dictionary<string, IWMPMedia>();List<string> al = new List<string>(); //当前歌词时间表     IWMPMedia media;/**下面这一大段API调用,主要是用来设置歌词窗口的滚动条的*但其实后面,我并没有怎么用到,只是在将滚动条滚动到底部时,用了一下*/private const int WM_VSCROLL = 0x115;private const int SB_HORZ = 0;private const int SB_VERT = 1;private const int SB_CTL = 2;private const int SB_BOTH = 3;private const int SB_LINEUP = 0;private const int SB_LINELEFT = 0;private const int SB_LINEDOWN = 1;private const int SB_LINERIGHT = 1;private const int SB_PAGEUP = 2;private const int SB_PAGELEFT = 2;private const int SB_PAGEDOWN = 3;private const int SB_PAGERIGHT = 3;private const int SB_THUMBPOSITION = 4;private const int SB_THUMBTRACK = 5;private const int SB_TOP = 6;private const int SB_LEFT = 6;private const int SB_BOTTOM = 7;private const int SB_RIGHT = 7;private const int SB_ENDSCROLL = 8;private const int WM_PAINT = 0x000F;[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern bool ScrollWindow(IntPtr hWnd, int XAmount, int YAmount, ref Rectangle lpRect, ref Rectangle lpClipRect);[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern int SetScrollPos(IntPtr hwnd, int nBar, int nPos, bool bRedraw);[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern int SetScrollPos(int nBar, int nPos, bool bRedraw);[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern int GetScrollPos(IntPtr hwnd, int nBar);[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern bool UpdateWindow(IntPtr hWnd);[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);public void setWord(){}public MusicPlayer(){this.StartPosition = FormStartPosition.CenterScreen;//窗口居中显示InitializeComponent();}private void MusicPlayer_Load(object sender, EventArgs e){InitLoad();}/// <summary>///  初始化 加载播放列表 如歌词 背景图 定时器等等/// </summary>private void InitLoad(){try{bool flag = false;string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bgImages");DirectoryInfo root = new DirectoryInfo(folder);FileInfo[] files = root.GetFiles();string fileName;for (int i = 0; i < files.Length; i++){fileName = files[i].Name.ToLower();if (fileName.EndsWith(".png") || fileName.EndsWith(".jpeg") || fileName.EndsWith(".jpg")){if (!flag){imageList = new List<string>();this.pictureBox1.Image = Image.FromFile(files[i].FullName);}imageList.Add(files[i].FullName);flag = true;}}playerType.Text = playerType.Items[0].ToString();//默认第一个closePoint = this.skinButtonClose.Location;dfSize = this.Size;richTextBox1.BackColor = this.TransparencyKey;skinComboBoxFontName.Text = skinComboBoxFontName.Items[0].ToString();//默认第一个skinComboBoxFontSize.Text = skinComboBoxFontSize.Items[0].ToString();//默认第一个ComboBoxSkinSelect.Text = ComboBoxSkinSelect.Items[0].ToString();//默认第一个//this.BackPalace = Image.FromFile(ComboBoxSkinSelect.Items[0].ToString());//默认第一个lvDetail.AllowDrop = true;lvDetail.View = View.Details;lvDetail.DragEnter += Files_DragEnter;//对象拖拽事件lvDetail.DragDrop += Files_DragDrop;//拖拽操作完成事件//wmp.OpenStateChange += WMP_OpenStateChange;wmp.PlayStateChange += WMP_PlayStateChange;timerImgs.Start();}catch (Exception ex){Console.WriteLine("错误:" + ex.Message);}}/// <summary>/// 提供给透明歌词窗口的定时器调用的/// </summary>/// <param name="s"></param>public void showTmform(bool s){if (s){this.btmForm.Show();if (this.first_in){this.lrcForm.TopMost = true;Point point = this.Location;point.Y = point.Y + this.Height;this.lrcForm.Location = point;this.btmForm.Location = point;this.lrcForm.Width = this.Width;this.btmForm.Width = this.Width;this.first_in = false;}}else{this.first_in = true;this.btmForm.Hide();}}/// <summary>///  播放时会进入这个事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void WMP_PlayStateChange(object sender, _WMPOCXEvents_PlayStateChangeEvent e){loadLrc();}/// <summary>/// 拖拽操作完成事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Files_DragDrop(object sender, DragEventArgs e){try{string fileName, fileExtension, fileSize, temp;FileInfo fi = null;ListViewItem lvi = null;Array array = (Array)e.Data.GetData(DataFormats.FileDrop);Regex regex = new Regex("(\\.mp3|\\.wav|\\.wma)");string filePath;for (int i = 0; i < array.Length; i++){filePath = array.GetValue(i).ToString();//属于音乐文件 且列表中不存在if (regex.IsMatch(filePath) &&!dic.ContainsKey(filePath)){wmp.Ctlcontrols.stop();InsertPlayList(out fileName, out fileExtension, out fileSize, out temp, out fi, out lvi, filePath);}}}catch (Exception ex){MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}/// <summary>/// 插入播放列表 和字典集/// </summary>/// <param name="fileName"></param>/// <param name="fileExtension"></param>/// <param name="fileSize"></param>/// <param name="temp"></param>/// <param name="fi"></param>/// <param name="lvi"></param>/// <param name="filePath"></param>private void InsertPlayList(out string fileName, out string fileExtension, out string fileSize, out string temp, out FileInfo fileInfo, out ListViewItem listViewItem, string filePath){fileInfo = new FileInfo(filePath);temp = filePath.Remove(filePath.LastIndexOf('.'));fileName = Path.GetFileNameWithoutExtension(filePath);fileExtension = Path.GetExtension(filePath);fileSize = (fileInfo.Length / 1024).ToString() + "KB";listViewItem = new ListViewItem();listViewItem.Text = index++.ToString();listViewItem.SubItems.AddRange(new string[] { fileName, fileExtension, fileSize, filePath });lvDetail.Items.Add(listViewItem);//添加到播放列表media = wmp.newMedia(filePath);//listIndex++, //wmp.currentPlaylist.insertItem(media);wmp.currentPlaylist.appendItem(media);playListDict.Add(filePath, media);//杜绝重复项dic.Add(filePath, fileName);}/// <summary>/// 文件拖拽进入/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Files_DragEnter(object sender, DragEventArgs e){if (e.Data.GetDataPresent(DataFormats.FileDrop)){e.Effect = DragDropEffects.Link;}else{e.Effect = DragDropEffects.None;}}/// <summary>/// 导入文件/// </summary>private void tsmiLoading_Click(object sender, EventArgs e){string fileName, fileExtension, fileSize, temp;FileInfo fi = null;ListViewItem lvi = null;openFileDialog1.Multiselect = true;openFileDialog1.Filter = "mp3文件(*.mp3)|*.mp3|wav文件(*.wav)|*.wav|wma文件(*.wma)|*.wma";if (openFileDialog1.ShowDialog() == DialogResult.OK){//顺序播放wmp.settings.setMode("shuffle", false);foreach (string filePath in openFileDialog1.FileNames){if (!dic.ContainsKey(filePath)){InsertPlayList(out fileName, out fileExtension, out fileSize, out temp, out fi, out lvi, filePath);}}}}/// <summary>/// 清除列表/// </summary>private void ListViewClear_Click(object sender, EventArgs e){lvDetail.Items.Clear();}/// <summary>/// 播放/// </summary>private void tsmiPlayer_Click(object sender, EventArgs e){wmp.Ctlcontrols.play();}/// <summary>/// 暂停/// </summary>private void tsmiWaiting_Click(object sender, EventArgs e){wmp.Ctlcontrols.pause();}/// <summary>/// 停止/// </summary>private void tsmiStop_Click(object sender, EventArgs e){wmp.Ctlcontrols.stop();}/// <summary>/// 退出/// </summary>private void tsmiExit_Click(object sender, EventArgs e){Application.Exit();}/// <summary>/// 双击某项播放/// </summary>private void lvDetail_DoubleClick(object sender, EventArgs e){if (lvDetail.SelectedItems.Count > 0){wmp.currentMedia = wmp.currentPlaylist.Item[int.Parse(lvDetail.SelectedItems[0].Text) - 1];}}/// <summary>///  循环播放/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void tsmiXunHuan_Click(object sender, EventArgs e){//点击项ToolStripMenuItem currentItem = (ToolStripMenuItem)sender;ToolStripItemCollection items = this.tsmiSet.DropDownItems;ToolStripMenuItem item;for (int i = 0; i < items.Count; i++){item = (ToolStripMenuItem)items[i];item.Checked = false;if (item.Name == currentItem.Name){item.Checked = true;}}wmp.settings.setMode("loop", true);}//顺序private void tsmiDanQu_Click(object sender, EventArgs e){IWMPMedia currentMedia = wmp.currentMedia;//点击项ToolStripMenuItem currentItem = (ToolStripMenuItem)sender;ToolStripItemCollection items = this.tsmiSet.DropDownItems;ToolStripMenuItem item;for (int i = 0; i < items.Count; i++){item = (ToolStripMenuItem)items[i];item.Checked = false;if (item.Name == currentItem.Name){item.Checked = true;}}//顺序播放wmp.settings.setMode("shuffle", false);}/// <summary>///  图片宽高设置 /// </summary>/// <param name="imgToResize"></param>/// <param name="size"></param>/// <returns></returns>public static Image ResizeImage(Image imgToResize, Size size){//获取图片宽度int sourceWidth = imgToResize.Width;//获取图片高度int sourceHeight = imgToResize.Height;float nPercent = 0;float nPercentW = 0;float nPercentH = 0;//计算宽度的缩放比例nPercentW = ((float)size.Width / (float)sourceWidth);//计算高度的缩放比例nPercentH = ((float)size.Height / (float)sourceHeight);if (nPercentH < nPercentW)nPercent = nPercentH;elsenPercent = nPercentW;//期望的宽度int destWidth = (int)(sourceWidth * nPercent);//期望的高度int destHeight = (int)(sourceHeight * nPercent);Bitmap b = new Bitmap(destWidth, destHeight);Graphics g = Graphics.FromImage((System.Drawing.Image)b);g.InterpolationMode = InterpolationMode.HighQualityBicubic;//绘制图像g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);g.Dispose();return (System.Drawing.Image)b;}private void playerType_SelectedIndexChanged(object sender, EventArgs e){if (playerType.Text == "顺序播放"){//顺序播放wmp.settings.setMode("shuffle", false);}else if (playerType.Text == "循环播放"){wmp.settings.setMode("loop", true);}else if (playerType.Text == "随机播放"){//顺序播放wmp.settings.setMode("shuffle", true);}}/// <summary>/// 定时器执行的方法,每隔1秒执行一次  歌词逐行显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ShowLineLrc(object sender, EventArgs e){this.label1.Text = this.wmp.Ctlcontrols.currentPositionString;if (this.lrcForm == null){this.lrcForm = new TMForm();Point pos = this.Location;pos.Y = lrcForm.Location.Y + lrcForm.Height;this.Location = pos;this.btmForm = new BTMForm();MusicPlayer mainForm = (MusicPlayer)this.Owner;btmForm.Location = pos;this.lrcForm.Owner = this;this.btmForm.Owner = this;this.btmForm.Hide();this.lrcForm.Show();}if (this.wmp.currentMedia == null){this.richTextBox1.Text = "";return;}string durationString = this.wmp.currentMedia.durationString;int trackBarValue = Convert.ToInt32(this.wmp.Ctlcontrols.currentPosition);//this.trackBar1.Maximum = Convert.ToInt32(this.wmp.currentMedia.duration);//this.trackBar1.Value = Convert.ToInt32(this.wmp.Ctlcontrols.currentPosition);if (this.richTextBox1.Text != "歌词文件不存在" && this.richTextBox1.Text != "歌词文件内容为空"){int pos = al.IndexOf(trackBarValue.ToString());bool isAr = this.richTextBox1.Text.Contains("歌手:");bool isTi = this.richTextBox1.Text.Contains("歌名:");if (pos >= 0){int n = isAr ? 1 : 0;int m = isTi ? 1 : 0;int height = 28 * (this.al.Count + m + n);int max = height - this.richTextBox1.Height;this.richTextBox1.SelectAll();this.richTextBox1.SelectionColor = Color.Black;this.richTextBox1.SelectionLength = 0;/**/int l = this.richTextBox1.Lines[pos + m + n].Length;this.richTextBox1.Select(this.richTextBox1.GetFirstCharIndexFromLine(pos + m + n), l);this.richTextBox1.SelectionColor = Color.OrangeRed;this.richTextBox1.SelectionLength = 0;//this.Text = GetScrollPos(this.richTextBox1.Handle, SB_VERT).ToString() + "-" + al.Count + "-" + this.richTextBox1.Height;if ((pos + m + n) * 28 <= max){int start = this.richTextBox1.GetFirstCharIndexFromLine(pos + m + n);this.richTextBox1.SelectionStart = start;this.richTextBox1.ScrollToCaret();}else{//this.richTextBox1.Focus();SendMessage(this.richTextBox1.Handle, WM_VSCROLL, SB_BOTTOM, 0);UpdateWindow(this.richTextBox1.Handle);//this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length;//this.richTextBox1.ScrollToCaret();}if (this.lrcForm != null){string l1 = this.richTextBox1.Lines[pos + m + n];string l2;if ((pos + m + n) < this.richTextBox1.Lines.Length - 1){l2 = this.richTextBox1.Lines[pos + m + n + 1];}else{l2 = "。。。。。";}this.lrcForm.setLrc(l1, l2, pos);//this.lrcForm.setLrc(ArrayList al,);}}}//this.Text = this.trackBar1.Value.ToString();/*if (trackBarValue >= (this.trackBar1.Maximum - 2)){this.PlayModeChange();}*/}/// <summary>/// 载入歌词/// </summary>/// <param name="lrc_filename">歌词路径名</param>public void loadLrc(){if (this.wmp.playState == WMPPlayState.wmppsPlaying){IWMPMedia currentMedia = wmp.currentMedia;string fullPath = currentMedia.sourceURL;string geciPath = Path.Combine(Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath) + ".lrc");//播放哪个资源 列表需选中ListView.ListViewItemCollection listViewItems = lvDetail.Items;lvDetail.FullRowSelect = true;for (int i = 0; i < listViewItems.Count; i++){listViewItems[i].Checked = false;listViewItems[i].Selected = false;listViewItems[i].BackColor = Color.White;if (listViewItems[i].SubItems[4].Text == fullPath){listViewItems[i].Checked = true;listViewItems[i].Selected = true;listViewItems[i].BackColor = Color.LightBlue;}}if (!File.Exists(geciPath)){this.richTextBox1.Text = "歌词文件内容为空";return;}using (StreamReader sr = new StreamReader(new FileStream(geciPath, FileMode.Open), Encoding.Default)){string tempLrc = "";while (!sr.EndOfStream){tempLrc = sr.ReadToEnd();}if (tempLrc.Trim() == ""){this.richTextBox1.Text = "歌词文件内容为空";return;}tempLrc = tempLrc.Trim();Regex rg = new Regex("\r*\n*\\[ver:(.*)\\]\r*\n*");tempLrc = rg.Replace(tempLrc, "");rg = new Regex("\r*\n*\\[al:(.*)\\]\r*\n*");tempLrc = rg.Replace(tempLrc, "");rg = new Regex("\r*\n*\\[by:(.*)\\]\r*\n*");tempLrc = rg.Replace(tempLrc, "");rg = new Regex("\r*\n*\\[offset:(.*)\\]\r*\n*");tempLrc = rg.Replace(tempLrc, "");rg = new Regex("\r*\n*\\[ar:(.*)\\]\r*\n*");Match mtch;mtch = rg.Match(tempLrc);tempLrc = rg.Replace(tempLrc, "\n歌手:" + mtch.Groups[1].Value + "\n");rg = new Regex("\r*\n*\\[ti:(.+?)\\]\r*\n*");   //这里注意贪婪匹配问题.+?mtch = rg.Match(tempLrc);tempLrc = rg.Replace(tempLrc, "\n歌名:" + mtch.Groups[1].Value + "\n");rg = new Regex("\r*\n*\\[[0-9][0-9]:[0-9][0-9].[0-9][0-9]\\]");MatchCollection mc = rg.Matches(tempLrc);al.Clear();foreach (Match m in mc){string temp = m.Groups[0].Value;//this.Text += temp + "+";                        string mi = temp.Substring(temp.IndexOf('[') + 1, 2);string se = temp.Substring(temp.IndexOf(':') + 1, 2);string ms = temp.Substring(temp.IndexOf('.') + 1, 2);   //这是毫秒,其实我只精确到秒,毫秒后面并没有用//this.Text += mi + ":" + se + "+";string time = Convert.ToInt32(mi) * 60 + Convert.ToInt32(se) + "";  //这里并没有添加毫秒al.Add(time);}tempLrc = rg.Replace(tempLrc, "\n");char[] remove = { '\r', '\n', ' ' };this.richTextBox1.Text = tempLrc.TrimStart(remove);this.timer1.Interval = 1000;this.timer1.Tick += ShowLineLrc;this.timer1.Start();}}}private void wmp_Enter(object sender, EventArgs e){loadLrc();//点击播放}/// <summary>///  删除选中的文件 并停止播放/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void skinButton2_Click(object sender, EventArgs e){try{ListView.SelectedIndexCollection indexes = this.lvDetail.SelectedIndices;if (indexes.Count > 0){int index = indexes[0];string path = this.lvDetail.Items[index].SubItems[4].Text;IWMPPlaylist iWMPPlaylist = wmp.currentPlaylist;//先移除播放列表 再移除listview列表wmp.currentPlaylist.removeItem(playListDict[path]);playListDict.Remove(path);this.lvDetail.Items[index].Remove();dic.Remove(path);wmp.Ctlcontrols.stop();}}catch (Exception ex){MessageBox.Show("操作失败!\n" + ex.Message, "提示", MessageBoxButtons.OK,MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);}}/// <summary>/// 列表鼠标双击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void lvDetail_MouseDoubleClick(object sender, MouseEventArgs e){try{ListView.SelectedIndexCollection indexes = this.lvDetail.SelectedIndices;if (indexes.Count > 0){int index = indexes[0];string path = this.lvDetail.Items[index].SubItems[4].Text;wmp.Ctlcontrols.playItem(playListDict[path]);//wmp.URL = path;//这种方式会失去播放列表【不是肉眼可见的listview列表】wmp.Ctlcontrols.stop();wmp.Ctlcontrols.play();}}catch (Exception ex){MessageBox.Show("操作失败!\n" + ex.Message, "提示", MessageBoxButtons.OK,MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);}}/// <summary>/// 字体改变/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void skinComboBoxFontName_SelectedIndexChanged(object sender, EventArgs e){if (this.lrcForm != null){this.lrcForm.ChangeLabelFont(this.skinComboBoxFontName.SelectedItem.ToString(), this.skinComboBoxFontSize.SelectedItem.ToString());}}/// <summary>/// 字体大小改变/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void skinComboBox1_SelectedIndexChanged(object sender, EventArgs e){if (this.lrcForm != null){this.lrcForm.ChangeLabelFont(this.skinComboBoxFontName.SelectedItem.ToString(), this.skinComboBoxFontSize.SelectedItem.ToString());}}/// <summary>/// 歌词是否显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void skinButton5_Click(object sender, EventArgs e){if (this.lrcForm == null){return;}this.showLrc = !this.showLrc;this.skinButton5.Text = this.showLrc ? "关闭" : "显示";if (this.showLrc){this.btmForm.Show();this.lrcForm.Show();}else{this.btmForm.Hide();this.lrcForm.Hide();}}/// <summary>/// 背景图片切换/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void timerImgs_Tick(object sender, EventArgs e){if (imageInd <= imageList.Count - 2){imageInd++;this.pictureBox1.Image.Dispose();this.pictureBox1.Image = Image.FromFile(imageList[imageInd]);}else{imageInd=0;}}/// <summary>/// 粘贴音乐到播放列表/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void lvDetail_KeyDown(object sender, KeyEventArgs e){System.Collections.Specialized.StringCollection stringCollection = Clipboard.GetFileDropList();if (stringCollection != null){string fileName, fileExtension, fileSize, temp;FileInfo fi = null;ListViewItem lvi = null;foreach (var item in stringCollection){if ((item.ToLower().EndsWith(".mp3") ||item.ToLower().EndsWith(".wav") ||item.ToLower().EndsWith(".wma")) && !dic.ContainsKey(item) ){InsertPlayList(out fileName, out fileExtension, out fileSize, out temp, out fi, out lvi, item);}}}}//选择皮肤private void ComboBoxSkinSelect_SelectedIndexChanged(object sender, EventArgs e){string bgColor = ComboBoxSkinSelect.SelectedItem.ToString();if (!string.IsNullOrEmpty(ComboBoxSkinSelect.SelectedItem.ToString())){switch (bgColor){case "渐变黑":this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_black;break;case "天蓝色":this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_light_blue;break;case "墨绿色":this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_green;break;case "蓝色":this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_s_blue;break;case "浅灰色":this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_grey;break;  case "亮色":this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_light;break;default:this.BorderPalace = kenMusicPlayer.Properties.Resources.bg_black;break;}/*this.UpdateStyles();this.Update();*///this.BackPalace = Image.FromFile(ComboBoxSkinSelect.SelectedItem.ToString());}}/// <summary>/// 退出/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void skinButtonClose_Click(object sender, EventArgs e){//this.Close();Application.Exit();}private void MusicPlayer_Resize(object sender, EventArgs e){try{Size size = this.Size;int x = (size.Width - dfSize.Width) + closePoint.X;int y = closePoint.Y;//(size.Height - dfSize.Height) + closePoint.Y;Point point = new Point(x, y);this.skinButtonClose.Location = point;}catch (Exception ex){Console.WriteLine("异常:" + ex.Message);}}/// <summary>/// 改方法也是提供给透明歌词窗口用的,用来修改半透明窗体的位置,是透明歌词窗口和半透明窗体始终重合/// </summary>/// <param name="pos"></param>public void moveTmform(Point pos){this.btmForm.Location = pos;}}
}

源码地址:https://gitee.com/ten-ken/music_player

本文来源于:程序员ken,专属平台有csdn、思否(SegmentFault)、 简书、 开源中国(oschina)、掘金,转载请注明出处。

手把手教你做一款音乐播放器(csharp的winform)相关推荐

  1. 【开源推荐】进阶实战,从一款音乐播放器开始

    0.前言 前面有同学问我,想要做一个Android 实战项目,问我有没有好的开源项目可以参考和练习? 想想自己以前也是,当项目没有什么新任务的时候,想着自己写一个实战项目来来练练手,那拿什么项目来练手 ...

  2. python3GUI--打造一款音乐播放器By:PyQt5(附下载地址)

    文章目录 一.准备工作 1.PyQt5 2.qtawesome 二.预览 1.启动 2.歌曲搜索 3.歌曲播放 4.评论查看 5.自定义背景 6.设置-基本设置 7.设置-高级设置 8.定时任务 三. ...

  3. 教你轻松拿下百度音乐播放器mp3地址

    教你轻松拿下百度音乐播放器mp3地址----ldfu2010 如果你想做一个类似百度或谷歌或QQ音乐那样的flash播放器,你最需要最重要的事情是什么?播放器什么做?我觉得应该不是,而是你的音乐mp3 ...

  4. java制作音乐播放器教程_教你轻松制作java音乐播放器

    一.音乐播放器的实现原理 Javase的多媒体功能很弱,所以有一个专门处理多媒体的插件叫JMF,JMF提供的模型可大致分为七类 * 数据源(Data source) * 截取设备(Capture De ...

  5. linux登陆界面卡死_Linux 上最好的五款音乐播放器

    Jack Wallen 盘点他最爱的五款 Linux 音乐播放器. 不管你做什么,你都有时会来一点背景音乐.不管你是开发.运维或是一个典型的电脑用户,享受美妙的音乐都可能是你在电脑上最想做的事情之一. ...

  6. 菜鸟最爱,60行代码打造一款音乐播放器!

    点上方"菜鸟学Python",选择"星标" 第467篇原创干货,第一时间送达 大家好,我是菜鸟哥! 对于小伙伴们来说,在日常的学习和工作中,很多人都喜欢边听音乐 ...

  7. linux安装音乐软件教程,Linux上好用的五款音乐播放器

    Jack Wallen 盘点他***的五款 Linux 音乐播放器. 不管你做什么,你都有时会来一点背景音乐.不管你是开发.运维或是一个典型的电脑用户,享受美妙的音乐都可能是你在电脑上最想做的事情之一 ...

  8. 教你3分钟自制音乐播放器

    首先在www.8box.cn上选择一个音乐播放器样式,就是自己定义播放器那里,然后自己在blog里添加一个自定义模块,把生成的代码添加进flash地址里,就可以把自己定义的播放器添加到自己的blog里 ...

  9. 综合作业:LPC2103做个PWM音乐播放器

    2019独角兽企业重金招聘Python工程师标准>>> 老师已经把ARM7的课给我们上完了,最后布置了四个综合作业让我们做.其中有PWM音乐播放器,电子密码锁,数字钟,PID温控器. ...

最新文章

  1. html表单c 后台如何接受,前台提交整个表单数据,后台实体类接收
  2. 转:小城也有好去处(3):云南建水 - 丽江大理之后第三城
  3. 计算从ios照片库中选取的图片文件大小
  4. 复方丙酸氯倍他索软膏購買技巧
  5. 解决锚点在IE8中失效
  6. python高阶函数看不懂_Python进阶:高阶函数的详细说明
  7. Tile-Based架构下的性能调校
  8. html开发日记-form button
  9. 【ESD专题】案例:同样是RS485芯片,ESD的性能却天差地别?
  10. 【毕业设计】stm32智能车牌识别系统 - 单片机 嵌入式
  11. 持续做正确的事,相信时间的复利
  12. 老毛桃u盘装系统linux,老毛桃U盘装系统综合教程
  13. ccc-sklearn-11-线性回归(1)
  14. Firewall常用
  15. Togaf业务架构-《企业级业务架构设计方法论与实践》解读
  16. zabbix监控用户密码剩余过期天数
  17. 美团人的写作基本功是如何练成的
  18. JAVA个人博客系统设计与实现 毕业设计开题报告
  19. srtm数据格式.hgt读取
  20. Bugku杂项——论剑

热门文章

  1. 独立站运营 | ManyChat是什么?有什么优缺点?
  2. 《层层恐惧2》中文免安装版下载 13.5G
  3. PyQuery 简介
  4. matlab错误使用 conv2,matlab conv2函数
  5. 洛谷OJ:P4779 【模板】单源最短路径(标准版)
  6. 字母或字母+数字组成正则表达式
  7. 爬虫获取车质网的投诉信息
  8. STM32+AS608指纹模块
  9. 使用Python的requests库作接口测试——对HPPT动词的支持
  10. 专家称小扎自主打造AI助手或需数百年