用mciSendString做音乐播放器

音乐操作类

  1 public class clsMCI
  2     {
  3         public clsMCI()
  4         {
  5             //
  6             // TODO: 在此处添加构造函数逻辑
  7             //
  8         }
  9 
 10         //定义API函数使用的字符串变量 
 11         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
 12         private string Name = "";
 13         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
 14         private string durLength = "";
 15         [MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]
 16         private string TemStr = "";
 17         int ilong;
 18         //定义播放状态枚举变量
 19         public enum State
 20         {
 21             mPlaying = 1,
 22             mPuase = 2,
 23             mStop = 3
 24         };
 25         //结构变量
 26         public struct structMCI
 27         {
 28             public bool bMut;
 29             public int iDur;
 30             public int iPos;
 31             public int iVol;
 32             public int iBal;
 33             public string iName;
 34             public State state;
 35         };
 36 
 37         public structMCI mc = new structMCI();
 38 
 39         //取得播放文件属性
 40         public string FileName
 41         {
 42             get
 43             {
 44                 return mc.iName;
 45             }
 46 
 47             set
 48             {
 49                 //ASCIIEncoding asc = new ASCIIEncoding(); 
 50                 try
 51                 {
 52                     TemStr = "";
 53                     TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));
 54                     Name = Name.PadLeft(260, Convert.ToChar(" "));
 55                     mc.iName = value;
 56                     ilong = APIClass.GetShortPathName(mc.iName, Name, Name.Length);
 57                     Name = GetCurrPath(Name);
 58                     //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";
 59                     Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";
 60                     ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length, 0);
 61                     ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0);
 62                     ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length, 0);
 63                     mc.state = State.mStop;
 64                 }
 65                 catch
 66                 {
 67                     MessageBox.Show("出错错误!");
 68                 }
 69             }
 70         }
 71 
 72         //播放
 73         public void play()
 74         {
 75             TemStr = "";
 76             TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));
 77             APIClass.mciSendString("play media", TemStr, TemStr.Length, 0);
 78             mc.state = State.mPlaying;
 79         }
 80         //停止
 81         public void StopT()
 82         {
 83             TemStr = "";
 84             TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
 85             ilong = APIClass.mciSendString("close media", TemStr, 128, 0);
 86             ilong = APIClass.mciSendString("close all", TemStr, 128, 0);
 87             mc.state = State.mStop;
 88 
 89         }
 90 
 91         public void Puase()
 92         {
 93             TemStr = "";
 94             TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
 95             ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0);
 96             mc.state = State.mPuase;
 97         }
 98         private string GetCurrPath(string name)
 99         {
100             if (name.Length < 1) return "";
101             name = name.Trim();
102             name = name.Substring(0, name.Length - 1);
103             return name;
104         }
105         //总时间
106         public int Duration
107         {
108             get
109             {
110                 durLength = "";
111                 durLength = durLength.PadLeft(128, Convert.ToChar(" "));
112                 APIClass.mciSendString("status media length", durLength, durLength.Length, 0);
113                 durLength = durLength.Trim();
114                 if (durLength == "") return 0;
115                 return (int)(Convert.ToDouble(durLength) / 1000f);
116             }
117         }
118 
119         //当前时间
120         public int CurrentPosition
121         {
122             get
123             {
124                 durLength = "";
125                 durLength = durLength.PadLeft(128, Convert.ToChar(" "));
126                 APIClass.mciSendString("status media position", durLength, durLength.Length, 0);
127                 durLength = durLength.Trim();
128                 if (durLength == "") return 0;
129                 mc.iPos = (int)(Convert.ToDouble(durLength) / 1000f);
130                 return mc.iPos;
131             }
132             set
133             {
134                 string Command = String.Format("Seek Media to {0}", value * 1000);
135                 APIClass.mciSendString(Command, null, 0, 0);//使播放停止  
136                 mc.state = State.mStop;
137                 mc.iPos = value * 1000;
138                 play(); 
139             }
140         }
141 
142 
143 
144     }
145 
146     public class APIClass
147     {
148 
149         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
150         public static extern int GetShortPathName(
151         string lpszLongPath,
152         string shortFile,
153         int cchBuffer
154         );
155 
156         [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
157         public static extern int mciSendString(
158         string lpstrCommand,
159         string lpstrReturnString,
160         int uReturnLength,
161         int hwndCallback
162         );
163 
164     }
clsMCI

 进度条控件

public class MyProgressBar : Control
    {
        public MyProgressBar()
        {
            ///在构造函数中设置控件Style,ControlStyles枚举可以参考
            ///http://technet.microsoft.com/zh-cn/subscriptions/system.windows.forms.controlstyles.aspx
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);

            //通过三个鼠标事件函数,让鼠标可以拖动控制条
            this.MouseDown += MyProgressBar_MouseDown;
            this.MouseMove += MyProgressBar_MouseMove;
            this.MouseUp += MyProgressBar_MouseUp;

            this.BackColor = Color.Transparent;
        }

        #region 定义变量,并对一些变量进行一些默认设置
        //已加载长度(灰色矩形)
        Rectangle foreRect;
        Color foregroundColor = Color.Gray;
        //总长度(底部白色矩形)
        Rectangle backRect;
        Color backgroundColor = Color.White;
        //控制块(黑色矩形)
        Rectangle setRect;
        Color setRectColor = Color.Black;

        //最大值
        int maximum = 100;
        //最小值
        int minimum = 0;
        //当前值
        double myValue = 0;
        //是否显示百分比
        bool showPercent;

        //进度条百分比的颜色 
        Color fontColor = Color.Black;
        //进度条百分比的字体大小
        float fontSize = 9;
        //进度条百分比的字体
        FontFamily myFontFamily = new FontFamily("宋体");
        #endregion

        #region 设置属性值
        [Category("进度条"), Description("显示百分比"), Browsable(true)]
        public bool ShowPercentTag
        {
            get { return showPercent; }
            set
            {
                showPercent = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的最大值"), Browsable(true)]
        public int Maximum
        {
            get { return maximum; }
            set
            {
                maximum = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的最小值"), Browsable(true)]
        public int Minimum
        {
            get { return minimum; }
            set
            {
                minimum = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的背景色,总长度(底部白色矩形)"), Browsable(true)]
        public Color BackgroundColor
        {
            get { return backgroundColor; }
            set
            {
                this.backgroundColor = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的前景色,已加载长度(灰色矩形)"), Browsable(true)]
        public Color ForegroundColor
        {
            get { return foregroundColor; }
            set
            {
                this.foregroundColor = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条控制块的颜色(黑色矩形)"), Browsable(true)]
        public Color SetRectColor
        {
            get { return setRectColor; }
            set
            {
                this.setRectColor = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的百分比字体大小"), Browsable(true)]
        public float FontSize
        {
            get { return fontSize; }
            set
            {
                this.fontSize = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的百分比字体"), Browsable(true)]
        public FontFamily MyFontFamily
        {
            get { return myFontFamily; }
            set
            {
                this.myFontFamily = value;
                Invalidate();
            }
        }

        [Category("进度条"), Description("进度条的百分比字体颜色"), Browsable(true)]
        public Color FontColor
        {
            get { return fontColor; }
            set
            {
                this.fontColor = value;
                Invalidate();
            }
        }
        #endregion

        #region 确定控件的位置
        [Category("General"), Description("控件的宽度"), Browsable(true)]
        public new int Width
        {
            get { return base.Width; }
            set
            {
                base.Width = value;
                foreRect.X = backRect.X = base.Width / 20;
                backRect.Width = base.Width * 9 / 10;
                foreRect.Width = (int)(myValue / maximum * backRect.Width);
                setRect.X = (int)(foreRect.X + foreRect.Width - setRect.Width / 2);

                Invalidate();
            }
        }

        [Category("General"), Description("控件的高度"), Browsable(true)]
        public new int Height
        {
            get { return base.Height; }
            set
            {
                base.Height = value;
                setRect.Height = setRect.Width = base.Height * 2 / 3;
                foreRect.Height = backRect.Height = base.Height / 3;
                setRect.Y = base.Height / 6;
                foreRect.Y = backRect.Y = base.Height / 3;
                Invalidate();
            }
        }
        #endregion

        #region value值改变事件

        protected EventHandler OnValueChanged;
        //当外部为该事件添加了响应函数时,事件就会生效,否则为OnValueChanged的值为null
        public event EventHandler ValueChanged
        {
            add
            {
                if (OnValueChanged != null)
                {
                    foreach (Delegate d in OnValueChanged.GetInvocationList())
                    {
                        if (object.ReferenceEquals(d, value)) { return; }
                    }
                }
                OnValueChanged = (EventHandler)Delegate.Combine(OnValueChanged, value);
            }
            remove
            {
                OnValueChanged = (EventHandler)Delegate.Remove(OnValueChanged, value);
            }
        }
        #endregion

        #region 定义Value属性

        //当Value值改变的时候,重新设置矩形的进度,控制块的位置,并且重绘控件
        //Value属性内如果对进度条的值进行修改,使用myValue变量,而在其他地方,则用Value属性
        [Category("进度条"), Description("进度条的值"), Browsable(true)]
        public double Value
        {
            get { return myValue; }
            set
            {
                if (myValue < Minimum)
                    throw new ArgumentException("小于最小值");
                if (myValue > Maximum)
                    throw new ArgumentException("超过最大值");

                myValue = value;
                foreRect.Width = (int)(myValue / maximum * backRect.Width);

                if ((myValue - maximum) > 0)
                {
                    foreRect.Width = backRect.Width;
                }

                setRect.X = (int)(foreRect.X + foreRect.Width - setRect.Width / 2);

                //如果添加了响应函数,则执行该函数
                if (OnValueChanged != null)
                {
                    OnValueChanged(this, EventArgs.Empty);
                }

                Invalidate();
            }
        }
        #endregion

        #region 绘制控件
        //重载OnPaint方法对控件进行绘制
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            DrawRect(e.Graphics);
            if (ShowPercentTag)
            {
                DrawText(e.Graphics);
            }
        }

        //画进度条
        private void DrawRect(Graphics e)
        {
            Pen pen = new Pen(this.foregroundColor);

            e.FillRectangle(new SolidBrush(this.backgroundColor), backRect);
            e.DrawRectangle(new Pen(Color.Black), backRect);

            e.FillRectangle(new SolidBrush(this.foregroundColor), foreRect);
            e.DrawRectangle(new Pen(Color.Black), foreRect);

            e.FillEllipse(new SolidBrush(this.setRectColor), setRect.X, setRect.Y, setRect.Width, setRect.Height);
            e.DrawEllipse(new Pen(Color.Black), setRect.X, setRect.Y, setRect.Width, setRect.Height);
            //e.FillRectangle(new SolidBrush(this.setRectColor), setRect);
            //e.DrawRectangle(new Pen(Color.Black), setRect);
        }

        //画进度值
        private void DrawText(Graphics e)
        {
            Point point = new Point();
            point.X = this.backRect.X + this.backRect.Width * 3 / 7;
            point.Y = this.backRect.Y + this.backRect.Height / 3;

            SolidBrush brush = new SolidBrush(fontColor);
            Font font = new Font(myFontFamily, this.fontSize);
            string percent = ((int)this.myValue).ToString() + "%";

            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;

            e.DrawString(percent, font, brush, backRect, format);
        }
        #endregion

        #region 修改控件的大小
        //拖动边缘的箭头改变控件的大小时,控件也要做相应的改变时,就可以重载该方法,如果没有重载,就只有在修改完成后才更新控件
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            this.Width = Width;
            this.Height = Height;
            Invalidate();
        }
        #endregion

        #region 拖动控制条
        //添加三个辅助变量,添加响应函数
        //当前鼠标位置
        Point originPoint;
        //当前控制块位置
        Point originsetRectPoint;
        //控制块是否点下
        bool setRectDown = false;

        //放开鼠标
        void MyProgressBar_MouseUp(object sender, MouseEventArgs e)
        {
            setRectDown = false;
        }

        //移动鼠标
        void MyProgressBar_MouseMove(object sender, MouseEventArgs e)
        {
            if (setRectDown)
            {
                //移动长度
                int dd = e.Location.X - originPoint.X;
                //百分比
                double percent = (double)(originsetRectPoint.X + dd - this.backRect.X + setRect.Width / 2) / this.backRect.Width;
                if (percent < 0)
                {
                    percent = 0;
                }
                else if (percent > 1)
                {

                    percent = 1;
                }
                this.Value = percent * maximum;
                this.foreRect.Width = (int)(percent * this.backRect.Width);
                //this.setRect.X = originsetRectPoint.X + dd;
                this.setRect.X = (int)(foreRect.X + foreRect.Width - setRect.Width / 2);
                Invalidate();
            }
        }

        //点下鼠标
        void MyProgressBar_MouseDown(object sender, MouseEventArgs e)
        {
            if (setRect.Contains(e.Location))
            {
                this.originPoint = e.Location;
                originsetRectPoint = this.setRect.Location;
                this.setRectDown = true;
            }
        }
        #endregion
    }
MyProgressBar

操作

1 clsMCI mp = new clsMCI();
2 mp.FileName = path;//路径
3 mp.Duration//总时间
4 mp.CurrentPosition//当前时间

进度条控制时间

nowtime = mySlider1.Value / mySlider1.Maximum * alltime;
mp.CurrentPosition = (int)nowtime;

音乐播放进度

nowtime = Convert.ToDouble(mp.CurrentPosition);
mySlider1.Value = nowtime / alltime * mySlider1.Maximum;

 实现界面

posted @ 2016-03-10 10:52  margin_gu  阅读(1227)  评论(1编辑  收藏  举报