/// <summary> /// 步骤进度控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Items")] [DefaultEvent("StepIndexChanged")] [Description("步骤进度控件")] public partial class StepProgressExt : Control { public delegate void StepEventHandler(object sender, StepItemEventArgs e); #region private event StepEventHandler stepIndexChanged; /// <summary> /// 步骤进度更改事件 /// </summary> [Description("步骤进度更改事件")] public event StepEventHandler StepIndexChanged { add { this.stepIndexChanged += value; } remove { this.stepIndexChanged -= value; } } private StepOrientation orientation = StepOrientation.HorizontalTop; /// <summary> /// 步骤控件方向位置 /// </summary> [DefaultValue(StepOrientation.HorizontalTop)] [Description("步骤控件方向位置")] public StepOrientation Orientation { get { return this.orientation; } set { if (this.orientation == value) return; this.orientation = value; this.InitializeSlideValueRectangleFs(); this.Invalidate(); } } private int stepSpace = 80; /// <summary> /// 步骤选项间距 /// </summary> [DefaultValue(80)] [Description("步骤选项间距")] public int StepSpace { get { return this.stepSpace; } set { if (this.stepSpace == value || value < 0) return; this.stepSpace = value; this.InitializeSlideValueRectangleFs(); this.Invalidate(); } } private int stepLine = 2; /// <summary> /// 步骤线条大小 /// </summary> [DefaultValue(2)] [Description("步骤线条大小")] public int StepLine { get { return this.stepLine; } set { if (this.stepLine == value || value < 0) return; this.stepLine = value; this.InitializeSlideValueRectangleFs(); this.Invalidate(); } } #region 步骤选项 private int stepRadius = 12; /// <summary> /// 步骤选项圆形半径 /// </summary> [DefaultValue(12)] [Description("步骤选项圆形半径")] public int StepRadius { get { return this.stepRadius; } set { if (this.stepRadius == value || value < 0) return; this.stepRadius = value; this.InitializeSlideValueRectangleFs(); this.Invalidate(); } } private Color normalBackColor = Color.FromArgb(90, 255, 192, 203); /// <summary> /// 步骤默认背景颜色(全局配置) /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "90, 255, 192, 203")] [Description("步骤默认背景颜色(全局配置)")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color NormalBackColor { get { return this.normalBackColor; } set { if (this.normalBackColor == value) return; this.normalBackColor = value; this.Invalidate(); } } private Color finishBackColor = Color.FromArgb(255, 255, 255); /// <summary> /// 步骤完成背景颜色(全局配置) /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "255, 255, 255")] [Description("步骤完成背景颜色(全局配置)")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color FinishBackColor { get { return this.finishBackColor; } set { if (this.finishBackColor == value) return; this.finishBackColor = value; this.Invalidate(); } } private Color proceedColor = Color.FromArgb(179, 255, 160, 122); /// <summary> /// 步骤开始颜色(全局配置) /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "179, 255, 160, 122")] [Description("步骤开始颜色(全局配置)")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color ProceedColor { get { return this.proceedColor; } set { if (this.proceedColor == value) return; this.proceedColor = value; this.Invalidate(); } } private Color finishColor = Color.FromArgb(183, 154, 205, 50); /// <summary> /// 步骤完成颜色(全局配置) /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "183, 154, 205, 50")] [Description("步骤完成颜色(全局配置)")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color FinishColor { get { return this.finishColor; } set { if (this.finishColor == value) return; this.finishColor = value; this.Invalidate(); } } private StepItemCollection stepItemCollection; /// <summary> /// 步骤选项集合 /// </summary> [DefaultValue(null)] [Description("步骤选项集合")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public StepItemCollection Items { get { if (this.stepItemCollection == null) this.stepItemCollection = new StepItemCollection(this); return this.stepItemCollection; } } private int stepIndex = 0; /// <summary> /// 当前步骤的索引 /// </summary> [DefaultValue(0)] [Description("当前步骤的索引")] public int StepIndex { get { return this.stepIndex; } set { if (this.stepIndex == value) return; this.stepIndex = value; this.Invalidate(); if (this.stepIndexChanged != null) { this.stepIndexChanged(this, new StepItemEventArgs() { Item = this.Items[this.stepIndex] }); } } } #endregion #region 步骤选项文本 private Font textFont = new Font("宋体", 11, FontStyle.Regular); /// <summary> /// 步骤选项文本字体 /// </summary> [DefaultValue(typeof(Font), "11pt style=Regular")] [Description("步骤选项文本字体")] public Font TextFont { get { return this.textFont; } set { if (this.textFont == value) return; this.textFont = value; this.Invalidate(); } } private Color textColor = Color.FromArgb(154, 205, 50); /// <summary> /// 步骤选项文本颜色 /// </summary> [DefaultValue(typeof(Color), "154, 205, 50")] [Description("步骤选项文本颜色")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color TextColor { get { return this.textColor; } set { if (this.textColor == value) return; this.textColor = value; this.Invalidate(); } } #endregion #region 提示信息 private bool tipShow = true; /// <summary> /// 是否显示提示信息 /// </summary> [DefaultValue(true)] [Description("是否显示提示信息")] public bool TipShow { get { return this.tipShow; } set { if (this.tipShow == value) return; this.tipShow = value; } } /// <summary> /// 提示信息标题背景颜色 /// </summary> [DefaultValue(typeof(Color), "192, 206, 55")] [Description("提示信息标题背景颜色")] public Color TitleBackColor { get { return this.tooltip.TitleBackColor; } set { if (this.tooltip.TitleBackColor == value) return; this.tooltip.TitleBackColor = value; this.InitializeComponent(); } } /// <summary> /// 提示信息标题颜色 /// </summary> [DefaultValue(typeof(Color), "255, 255, 255")] [Description("提示信息标题颜色")] public Color TitleColor { get { return this.tooltip.TitleColor; } set { if (this.tooltip.TitleColor == value) return; this.tooltip.TitleColor = value; this.InitializeComponent(); } } /// <summary> /// 提示信息文本字体 /// </summary> [DefaultValue(typeof(Font), "宋体, 10pt")] [Description("提示信息文本字体")] public Font TipFont { get { return this.tooltip.Font; } set { if (this.tooltip.Font == value) return; this.tooltip.Font = value; } } /// <summary> /// 提示信息文本颜色 /// </summary> [Description("提示信息文本颜色")] public Color TipColor { get { return this.tooltip.ForeColor; } set { if (this.tooltip.ForeColor == value) return; this.tooltip.ForeColor = value; } } #endregion protected override Size DefaultSize { get { return new Size(300, 60); } } protected override Padding DefaultPadding { get { return new Padding(20, 10, 20, 10); } } /// <summary> /// 提示信息 /// </summary> private ToolTipExt tooltip; /// <summary> /// 提示信息状态 /// </summary> private bool isshow = false; #endregion public StepProgressExt() { SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.SupportsTransparentBackColor, true); InitializeComponent(); this.tooltip = new ToolTipExt(); this.tooltip.TitleShow = true; this.tooltip.MinSize = new Size(70, 30); this.tooltip.MaxSize = new Size(400, 0); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; Rectangle rectf = new Rectangle(this.Padding.Left, this.Padding.Top, e.ClipRectangle.Width - this.Padding.Left - this.Padding.Right, e.ClipRectangle.Height - this.Padding.Top - this.Padding.Bottom); #region 间隔线 for (int i = 1; i < this.Items.Count; i++) { #region 间隔线颜色 Color line_color = Color.Empty; if (i < this.StepIndex - 1) { if (this.Items[i].FinishColor == Color.Empty) line_color = this.FinishColor; else line_color = this.Items[i].FinishColor; } else if (i == this.StepIndex - 1) { if (this.Items[i].ProceedColor == Color.Empty) line_color = this.ProceedColor; else line_color = this.Items[i].ProceedColor; } else { if (this.Items[i].NormalBackColor == Color.Empty) line_color = this.NormalBackColor; else line_color = this.Items[i].NormalBackColor; } #endregion PointF point_strat = new PointF(this.Items[i - 1].RectF.Right - this.StepLine + this.StepLine / 2, this.Items[i - 1].RectF.Y + this.Items[i].RectF.Height / 2); PointF point_end = new PointF(this.Items[i].RectF.X + this.StepLine - this.StepLine / 2, this.Items[i].RectF.Y + this.Items[i].RectF.Height / 2); if (this.Orientation == StepOrientation.VerticalLeft || this.Orientation == StepOrientation.VerticalRight) { point_strat = new PointF(this.Items[i - 1].RectF.X + this.Items[i].RectF.Width / 2, this.Items[i - 1].RectF.Bottom - this.StepLine + this.StepLine / 2); point_end = new PointF(this.Items[i].RectF.X + this.Items[i].RectF.Width / 2, this.Items[i].RectF.Y + this.StepLine - this.StepLine / 2); } Pen line_pen = new Pen(line_color, this.StepLine); g.DrawLine(line_pen, point_strat, point_end); line_pen.Dispose(); } #endregion #region 圆 int text_space = 10;//文本离圆形距离 for (int i = 0; i < this.Items.Count; i++) { #region 圆形背景 #region 圆形背景颜色 Color circle_color = Color.Empty; if (i < this.StepIndex - 1) { if (this.Items[i].FinishBackColor == Color.Empty) circle_color = this.FinishBackColor; else circle_color = this.Items[i].FinishBackColor; } else { if (this.Items[i].NormalBackColor == Color.Empty) circle_color = this.NormalBackColor; else circle_color = this.Items[i].NormalBackColor; } #endregion SolidBrush circle_sb = new SolidBrush(circle_color); g.FillEllipse(circle_sb, this.Items[i].RectF); circle_sb.Dispose(); #endregion #region 边框 #region 边框颜色 Color border_color = Color.Empty; if (i < this.StepIndex - 1) { if (this.Items[i].FinishColor == Color.Empty) border_color = this.FinishColor; else border_color = this.Items[i].FinishColor; } else if (i == this.StepIndex - 1) { if (this.Items[i].ProceedColor == Color.Empty) border_color = this.ProceedColor; else border_color = this.Items[i].ProceedColor; } #endregion if (i <= this.StepIndex - 1) { //圆形边框 Pen border_pen = new Pen(border_color, this.StepLine); g.DrawEllipse(border_pen, TransformRectangleF(this.Items[i].RectF, this.StepLine)); border_pen.Dispose(); } #endregion #region 圆形圆心 if (i < this.StepIndex - 1) { float heart_w = this.Items[i].RectF.Width - this.StepLine * 2 - this.StepLine * 2; float heart_h = this.Items[i].RectF.Height - this.StepLine * 2 - this.StepLine * 2; RectangleF heart_rect = new RectangleF(this.Items[i].RectF.X + (this.Items[i].RectF.Width - heart_w) / 2, this.Items[i].RectF.Y + (this.Items[i].RectF.Height - heart_h) / 2, heart_w, heart_h); SolidBrush heart_sb = new SolidBrush(this.Items[i].FinishColor == Color.Empty ? this.FinishColor : this.Items[i].FinishColor); g.FillEllipse(heart_sb, heart_rect); heart_sb.Dispose(); } #endregion #region 文本 StringFormat text_sf = new StringFormat(); text_sf.FormatFlags = StringFormatFlags.NoWrap; text_sf.Alignment = StringAlignment.Center; text_sf.Trimming = StringTrimming.None; Size text_size = g.MeasureString(this.Items[i].Text, this.Items[i].TextFont, new SizeF(), text_sf).ToSize(); RectangleF text_rectf = new RectangleF(this.Items[i].RectF.X + (this.Items[i].RectF.Width - text_size.Width) / 2, this.Items[i].RectF.Bottom + text_space, text_size.Width, text_size.Height); if (this.Orientation == StepOrientation.HorizontalBottom) { text_rectf.Y = this.Items[i].RectF.Y - text_space - text_size.Height; } else if (this.Orientation == StepOrientation.VerticalLeft) { text_rectf.X = this.Items[i].RectF.Right + text_space; text_rectf.Y = this.Items[i].RectF.Y + (this.Items[i].RectF.Height - text_size.Height) / 2; } else if (this.Orientation == StepOrientation.VerticalRight) { text_rectf.X = this.Items[i].RectF.X - text_space - text_size.Width; text_rectf.Y = this.Items[i].RectF.Y + (this.Items[i].RectF.Height - text_size.Height) / 2; } SolidBrush text_sb = new SolidBrush(this.Items[i].TextColor == Color.Empty ? this.TextColor : this.Items[i].TextColor); g.DrawString(this.Items[i].Text, this.Items[i].TextFont, text_sb, text_rectf, text_sf); text_sb.Dispose(); #endregion } #endregion } protected override void OnResize(EventArgs e) { base.OnResize(e); this.InitializeSlideValueRectangleFs(); } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); this.isshow = false; } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); int index = this.GetSelectSlideIndex(this.PointToClient(Control.MousePosition)); if (index > -1) { if (!this.isshow) { ToolTipExt.ToolTipAnchor anchor = ToolTipExt.ToolTipAnchor.TopCenter; if (this.Orientation == StepOrientation.HorizontalBottom) { anchor = ToolTipExt.ToolTipAnchor.BottomCenter; } else if (this.Orientation == StepOrientation.VerticalLeft) { anchor = ToolTipExt.ToolTipAnchor.LeftCenter; } else if (this.Orientation == StepOrientation.VerticalRight) { anchor = ToolTipExt.ToolTipAnchor.RightCenter; } Rectangle rect = new Rectangle((int)this.Items[index].RectF.X, (int)this.Items[index].RectF.Y, (int)this.Items[index].RectF.Width, (int)this.Items[index].RectF.Height); this.tooltip.ToolTipTitle = this.Items[index].Text; string str = this.Items[index].Description == String.Empty ? " " : this.Items[index].Description; this.tooltip.Show(str, this, anchor, rect); this.isshow = true; } if (this.Cursor != Cursors.Hand) this.Cursor = Cursors.Hand; } else { if (this.isshow) { this.tooltip.Hide(this); this.isshow = false; } if (this.Cursor != Cursors.Default) this.Cursor = Cursors.Default; } } #region /// <summary> /// 计算所有滑块rectf /// </summary> /// <param name="item"></param> private void InitializeSlideValueRectangleFs() { for (int i = 0; i < this.Items.Count; i++) { this.InitializeSlideValueRectangleF(this.Items[i]); } } /// <summary> /// 计算指定滑块rectf /// </summary> /// <param name="item"></param> private void InitializeSlideValueRectangleF(StepItem item) { Rectangle rect = new Rectangle(this.Padding.Left, this.Padding.Top, this.ClientRectangle.Width - this.Padding.Left - this.Padding.Right, this.ClientRectangle.Height - this.Padding.Top - this.Padding.Bottom); int index = this.Items.IndexOf(item); if (this.Orientation == StepOrientation.HorizontalTop || this.Orientation == StepOrientation.HorizontalBottom) { int slide_x = this.Padding.Left - this.StepRadius / 2 + index * this.StepSpace; int slide_y = (this.Orientation == StepOrientation.HorizontalTop) ? this.Padding.Top + this.StepRadius / 2 : rect.Bottom - this.Padding.Bottom - this.StepRadius * 2; item.RectF = new RectangleF(slide_x, slide_y, this.StepRadius * 2, this.StepRadius * 2); } else { int slide_x = (this.Orientation == StepOrientation.VerticalLeft) ? this.Padding.Top + this.StepRadius / 2 : rect.Right - this.Padding.Right - this.StepRadius; int slide_y = this.Padding.Top - this.StepRadius / 2 + index * this.StepSpace; item.RectF = new RectangleF(slide_x, slide_y, this.StepRadius * 2, this.StepRadius * 2); } } /// <summary> /// 获取选中滑块索引 /// </summary> /// <param name="point">当前鼠标坐标</param> /// <returns></returns> private int GetSelectSlideIndex(Point point) { for (int i = 0; i < this.Items.Count; i++) { if (this.Items[i].RectF.Contains(point)) return i; } return -1; } /// <summary> /// 根据画笔大小转换rectf /// </summary> /// <param name="rectf">要转换的rectf</param> /// <param name="pen">画笔大小大小</param> /// <returns></returns> private static RectangleF TransformRectangleF(RectangleF rectf, int pen) { RectangleF result = new RectangleF(); result.Width = rectf.Width - (pen < 1 ? 0 : pen); result.Height = rectf.Height - (pen < 1 ? 0 : pen); result.X = rectf.X + (float)(pen / 2); result.Y = rectf.Y + (float)(pen / 2); return result; } #endregion protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); if (this.tooltip != null) { this.tooltip.Dispose(); } } base.Dispose(disposing); } /// <summary> /// 步骤选项集合 /// </summary> [Description("步骤选项集合")] [Editor(typeof(CollectionEditorExt), typeof(UITypeEditor))] public sealed class StepItemCollection : IList, ICollection, IEnumerable { private ArrayList stepItemList = new ArrayList(); private StepProgressExt owner; public StepItemCollection(StepProgressExt owner) { this.owner = owner; } #region IEnumerable public IEnumerator GetEnumerator() { StepItem[] listArray = new StepItem[this.stepItemList.Count]; for (int index = 0; index < listArray.Length; ++index) listArray[index] = (StepItem)this.stepItemList[index]; return listArray.GetEnumerator(); } #endregion #region ICollection public void CopyTo(Array array, int index) { for (int i = 0; i < this.Count; i++) array.SetValue(this.stepItemList[i], i + index); } public int Count { get { return this.stepItemList.Count; } } public bool IsSynchronized { get { return false; } } public object SyncRoot { get { return (object)this; } } #endregion #region IList public int Add(object value) { StepItem slideValue = (StepItem)value; slideValue.owner = this.owner; slideValue.self = slideValue; this.stepItemList.Add(slideValue); this.owner.InitializeSlideValueRectangleF(slideValue); this.owner.Invalidate(); return this.Count - 1; } public void Clear() { this.stepItemList.Clear(); this.owner.Invalidate(); } public bool Contains(object value) { return this.IndexOf(value) != -1; } public int IndexOf(object value) { return this.stepItemList.IndexOf(value); } public void Insert(int index, object value) { throw new NotImplementedException(); } public bool IsFixedSize { get { return false; } } public bool IsReadOnly { get { return false; } } public void Remove(object value) { if (!(value is StepItem)) return; this.stepItemList.Remove((StepItem)value); this.owner.Invalidate(); } public void RemoveAt(int index) { this.stepItemList.RemoveAt(index); this.owner.Invalidate(); } public StepItem this[int index] { get { return (StepItem)this.stepItemList[index]; } set { this.stepItemList[index] = (StepItem)value; this.owner.InitializeSlideValueRectangleF((StepItem)value); this.owner.Invalidate(); } } object IList.this[int index] { get { return (object)this.stepItemList[index]; } set { this.stepItemList[index] = (StepItem)value; this.owner.InitializeSlideValueRectangleF((StepItem)value); this.owner.Invalidate(); } } #endregion } /// <summary> /// 步骤选项 /// </summary> [Description("步骤选项")] public class StepItem { [EditorBrowsable(EditorBrowsableState.Never)] public StepItem() { } public StepItem(StepProgressExt owner) { this.owner = owner; } /// <summary> /// 控件主体 /// </summary> public StepProgressExt owner; /// <summary> /// 当前步骤选项 /// </summary> public StepItem self; private RectangleF rectf = new RectangleF(); /// <summary> /// 步骤rectf /// </summary> [Browsable(false)] [Description("滑块rectf")] public RectangleF RectF { get { return this.rectf; } set { if (this.rectf == value) return; this.rectf = value; } } private string text = ""; /// <summary> /// 步骤文本 /// </summary> [DefaultValue("")] [Description("步骤文本")] public string Text { get { return this.text; } set { if (this.text == value) return; this.text = value; if (this.owner != null) { this.owner.Invalidate(); } } } private Font textFont = new Font("宋体", 11, FontStyle.Regular); /// <summary> /// 步骤文本字体 /// </summary> [DefaultValue(typeof(Font), "11pt style=Regular")] [Description("步骤文本字体")] public Font TextFont { get { return this.textFont; } set { if (this.textFont == value) return; this.textFont = value; if (this.owner != null) { this.owner.Invalidate(); } } } private Color textColor = Color.Empty; /// <summary> /// 步骤文本颜色 /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "Empty")] [Description("步骤文本颜色")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color TextColor { get { return this.textColor; } set { if (this.textColor == value) return; this.textColor = value; if (this.owner != null) { this.owner.Invalidate(); } } } private string description = ""; /// <summary> /// 步骤文本描述 /// </summary> [DefaultValue("")] [Description("步骤文本描述")] [Editor(typeof(MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))] public string Description { get { return this.description; } set { if (this.description == value) return; this.description = value; if (this.owner != null) { this.owner.Invalidate(); } } } private Color normalBackColor = Color.Empty; /// <summary> /// 步骤默认背景颜色 /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "Empty")] [Description("步骤默认背景颜色")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color NormalBackColor { get { return this.normalBackColor; } set { if (this.normalBackColor == value) return; this.normalBackColor = value; if (this.owner != null) { this.owner.Invalidate(); } } } private Color finishBackColor = Color.Empty; /// <summary> /// 步骤完成背景颜色 /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "Empty")] [Description("步骤完成背景颜色")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color FinishBackColor { get { return this.finishBackColor; } set { if (this.finishBackColor == value) return; this.finishBackColor = value; if (this.owner != null) { this.owner.Invalidate(); } } } private Color proceedColor = Color.Empty; /// <summary> /// 步骤开始颜色 /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "Empty")] [Description("步骤开始颜色")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color ProceedColor { get { return this.proceedColor; } set { if (this.proceedColor == value) return; this.proceedColor = value; if (this.owner != null) { this.owner.Invalidate(); } } } private Color finishColor = Color.Empty; /// <summary> /// 步骤完成颜色 /// </summary> [Browsable(true)] [DefaultValue(typeof(Color), "Empty")] [Description("步骤完成颜色")] [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))] public Color FinishColor { get { return this.finishColor; } set { if (this.finishColor == value) return; this.finishColor = value; if (this.owner != null) { this.owner.Invalidate(); } } } } /// <summary> /// 步骤进度更改事件参数 /// </summary> [Description("步骤进度更改事件参数")] public class StepItemEventArgs : EventArgs { /// <summary> /// 步骤选项 /// </summary> [Description("步骤选项")] public StepItem Item { get; set; } } /// <summary> /// 控件步骤选项方向位置 /// </summary> [Description("控件步骤选项方向位置")] public enum StepOrientation { /// <summary> ///水平放置靠近上边 /// </summary> HorizontalTop, /// <summary> /// 水平放置靠近下边 /// </summary> HorizontalBottom, /// <summary> /// 垂直放置靠近左边 /// </summary> VerticalLeft, /// <summary> /// 垂直放置靠近右边 /// </summary> VerticalRight, } }
源码下载:步骤进度控件.zip