C#实现简单的loading提示控件实例代码
发布时间:2020-12-15 05:54:17 所属栏目:百科 来源:网络整理
导读:自己画一个转圈圈的控件 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Text;using System.Threading.Tasks;using S
自己画一个转圈圈的控件 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ExerciseUIPrj.controls { public partial class LoadControl : Control { Color beginColor = Color.Blue; Color endColor = Color.Red; int wid = 10; int curindex = 0; Timer timer; int instervel = 200; string loadStr = "loading...."; public LoadControl() { InitializeComponent(); SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint|ControlStyles.OptimizedDoubleBuffer,true); this.MinimumSize = new Size(40,80); if (!DesignMode) { Start(); } } public void Start() { if (timer == null) { timer = new Timer(); timer.Interval = instervel; timer.Tick += Timer_Tick; } timer.Enabled = true; } public void Stop() { if (timer != null) { timer.Enabled = false; } } void Timer_Tick(object sender,EventArgs e) { curindex++; curindex = curindex >= wid ? 0 : curindex; Refresh(); } //计算各种圈圈相关 Point getPoint(double d,double r,Point center) { int x = (int)(r * Math.Cos(d * Math.PI / 180.0)); int y = (int)(r * Math.Sin(d * Math.PI / 180.0)); return new Point(center.X + x,center.Y - y); } GraphicsPath getPath(Point a,Point b) { Point c,d,e,f; int h = 2; Vertical(a,b,h,out c,out d); Vertical(b,a,out e,out f); GraphicsPath path = new GraphicsPath(); path.AddPolygon(new Point[] { c,f }); path.CloseAllFigures(); return path; } bool Vertical(Point pointa,Point pointb,double R,out Point pointc,out Point pointd) { pointc = new Point(); pointd = new Point(); try { //(X-xa)^2+(Y-ya)^2=R*R 距离公式 //(X-xa)*(xb-xa)+(Y-ya)*(yb-ya)=0 垂直 //解方程得两点即为所求点 var cx = pointa.X - (pointb.Y - pointa.Y) * R / Distance(pointa,pointb); var cy = pointa.Y + (pointb.X - pointa.X) * R / Distance(pointa,pointb); var dx = pointa.X + (pointb.Y - pointa.Y) * R / Distance(pointa,pointb); var dy = pointa.Y - (pointb.X - pointa.X) * R / Distance(pointa,pointb); pointc = new Point((int)cx,(int)cy); pointd = new Point((int)dx,(int)dy); return true; } catch { //如果A,B两点重合会报错,那样就返回false return false; } } double Distance(double xa,double ya,double xb,double yb) { double L; L = Math.Sqrt(Math.Pow(xa - xb,2) + Math.Pow(ya - yb,2)); return L; } double Distance(Point pa,Point pb) { return Distance(pa.X,pa.Y,pb.X,pb.Y); } GraphicsPath getPath(double d,Point c) { var p1 = getPoint(d,r / 2.0,c); var p2 = getPoint(d,r,c); return getPath(p1,p2); } //算渐变色 Color[] getColors() { int dr = (int)((endColor.R - beginColor.R) / (double)wid); int dg = (int)((endColor.G - beginColor.G) / (double)wid); int db = (int)((endColor.B - beginColor.B) / (double)wid); List<Color> colors = new List<Color>(); for (int i = 0; i < wid; i++) { colors.Add(Color.FromArgb(beginColor.R + dr * i,beginColor.G + dg * i,beginColor.B + db * i)); } return colors.ToArray(); } //画圈圈 void drawRect(Graphics g) { int r = (int)(Size.Height / 2.0); Point center = new Point(r,r); var colors = getColors(); int findex = curindex; for (int i = 0; i < wid; i++) { double d = (360.0 / wid) * i; var p = getPath(d,center); int cindex = findex + i; cindex = cindex >= wid ? cindex - wid : cindex; g.FillPath(new SolidBrush(colors[cindex]),p); } } //画字符串 void drawString(Graphics g) { if (Size.Height >= Size.Width) return; Rectangle rect = new Rectangle(new Point(Size.Height,0),new Size(Size.Width - Size.Height,Size.Height)); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; g.DrawString(loadStr,Font,Brushes.Black,rect,sf); } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); Graphics g = pe.Graphics; g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; drawRect(g); drawString(g); } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); if (Size.Height > Size.Width) { Size = new Size(Size.Height,Size.Height); } } } } 总结 以上所述是小编给大家介绍的C#实现简单的loading提示控件实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |