用mciSendString做音乐播放器

时间:2023-03-09 16:14:51
用mciSendString做音乐播放器

音乐操作类

 public class clsMCI
{
public clsMCI()
{
//
// TODO: 在此处添加构造函数逻辑
//
} //定义API函数使用的字符串变量
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
private string Name = "";
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
private string durLength = "";
[MarshalAs(UnmanagedType.LPTStr, SizeConst = )]
private string TemStr = "";
int ilong;
//定义播放状态枚举变量
public enum State
{
mPlaying = ,
mPuase = ,
mStop =
};
//结构变量
public struct structMCI
{
public bool bMut;
public int iDur;
public int iPos;
public int iVol;
public int iBal;
public string iName;
public State state;
}; public structMCI mc = new structMCI(); //取得播放文件属性
public string FileName
{
get
{
return mc.iName;
} set
{
//ASCIIEncoding asc = new ASCIIEncoding();
try
{
TemStr = "";
TemStr = TemStr.PadLeft(, Convert.ToChar(" "));
Name = Name.PadLeft(, Convert.ToChar(" "));
mc.iName = value;
ilong = APIClass.GetShortPathName(mc.iName, Name, Name.Length);
Name = GetCurrPath(Name);
//Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";
Name = "open " + Convert.ToChar() + Name + Convert.ToChar() + " alias media";
ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length, );
ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, );
ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length, );
mc.state = State.mStop;
}
catch
{
MessageBox.Show("出错错误!");
}
}
} //播放
public void play()
{
TemStr = "";
TemStr = TemStr.PadLeft(, Convert.ToChar(" "));
APIClass.mciSendString("play media", TemStr, TemStr.Length, );
mc.state = State.mPlaying;
}
//停止
public void StopT()
{
TemStr = "";
TemStr = TemStr.PadLeft(, Convert.ToChar(" "));
ilong = APIClass.mciSendString("close media", TemStr, , );
ilong = APIClass.mciSendString("close all", TemStr, , );
mc.state = State.mStop; } public void Puase()
{
TemStr = "";
TemStr = TemStr.PadLeft(, Convert.ToChar(" "));
ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, );
mc.state = State.mPuase;
}
private string GetCurrPath(string name)
{
if (name.Length < ) return "";
name = name.Trim();
name = name.Substring(, name.Length - );
return name;
}
//总时间
public int Duration
{
get
{
durLength = "";
durLength = durLength.PadLeft(, Convert.ToChar(" "));
APIClass.mciSendString("status media length", durLength, durLength.Length, );
durLength = durLength.Trim();
if (durLength == "") return ;
return (int)(Convert.ToDouble(durLength) / 1000f);
}
} //当前时间
public int CurrentPosition
{
get
{
durLength = "";
durLength = durLength.PadLeft(, Convert.ToChar(" "));
APIClass.mciSendString("status media position", durLength, durLength.Length, );
durLength = durLength.Trim();
if (durLength == "") return ;
mc.iPos = (int)(Convert.ToDouble(durLength) / 1000f);
return mc.iPos;
}
set
{
string Command = String.Format("Seek Media to {0}", value * );
APIClass.mciSendString(Command, null, , );//使播放停止
mc.state = State.mStop;
mc.iPos = value * ;
play();
}
} } public class APIClass
{ [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName(
string lpszLongPath,
string shortFile,
int cchBuffer
); [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
public static extern int mciSendString(
string lpstrCommand,
string lpstrReturnString,
int uReturnLength,
int hwndCallback
); }

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 = ;
//最小值
int minimum = ;
//当前值
double myValue = ;
//是否显示百分比
bool showPercent; //进度条百分比的颜色
Color fontColor = Color.Black;
//进度条百分比的字体大小
float fontSize = ;
//进度条百分比的字体
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 / ;
backRect.Width = base.Width * / ;
foreRect.Width = (int)(myValue / maximum * backRect.Width);
setRect.X = (int)(foreRect.X + foreRect.Width - setRect.Width / ); Invalidate();
}
} [Category("General"), Description("控件的高度"), Browsable(true)]
public new int Height
{
get { return base.Height; }
set
{
base.Height = value;
setRect.Height = setRect.Width = base.Height * / ;
foreRect.Height = backRect.Height = base.Height / ;
setRect.Y = base.Height / ;
foreRect.Y = backRect.Y = base.Height / ;
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) > )
{
foreRect.Width = backRect.Width;
} setRect.X = (int)(foreRect.X + foreRect.Width - setRect.Width / ); //如果添加了响应函数,则执行该函数
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 * / ;
point.Y = this.backRect.Y + this.backRect.Height / ; 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 / ) / this.backRect.Width;
if (percent < )
{
percent = ;
}
else if (percent > )
{ percent = ;
}
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 / );
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

操作

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

进度条控制时间

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

音乐播放进度

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

实现界面

用mciSendString做音乐播放器