当前位置: 移动技术网 > IT编程>开发语言>c# > C#实现简单的loading提示控件实例代码

C#实现简单的loading提示控件实例代码

2019年07月18日  | 移动技术网IT编程  | 我要评论

自己画一个转圈圈的控件

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, h, out e, out f);
      graphicspath path = new graphicspath();
      path.addpolygon(new point[] { c, d, e, 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, double r, 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, r, 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提示控件实例代码,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网