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

发布时间 - 2026-01-11 03:04:54    点击率:

自己画一个转圈圈的控件

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提示控件实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


# c#  # loading  # 提示控件  # c  # loading控件  # 如何使用C#中的Lazy的使用方法  # C#中的Lazy如何使用详解  # C#基础 延迟加载介绍与实例  # 详解C# Lazy Loading(延迟加载)  # 小编  # 两点  # 给大家  # 报错  # 即为  # 所述  # 给我留言  # 画一  # 有任何  # 渐变色  # Size  # true  # MinimumSize  # Start  # void  # DesignMode  # OptimizedDoubleBuffer  # InitializeComponent  # string 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 大连 网站制作,大连天途有线官网?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Python正则表达式进阶教程_复杂匹配与分组替换解析  如何快速搭建个人网站并优化SEO?  Laravel如何处理异常和错误?(Handler示例)  Laravel如何为API生成Swagger或OpenAPI文档  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何在自有机房高效搭建专业网站?  中山网站制作网页,中山新生登记系统登记流程?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  javascript基于原型链的继承及call和apply函数用法分析  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  java ZXing生成二维码及条码实例分享  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何在腾讯云服务器上快速搭建个人网站?  韩国服务器如何优化跨境访问实现高效连接?  如何在IIS中新建站点并配置端口与物理路径?  Laravel如何使用Vite进行前端资源打包?(配置示例)  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  HTML 中动态设置元素 name 属性的正确语法详解  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  制作电商网页,电商供应链怎么做?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何续费美橙建站之星域名及服务?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel怎么在Controller之外的地方验证数据  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何基于PHP生成高效IDC网络公司建站源码?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何用搬瓦工VPS快速搭建个人网站?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  浅谈javascript alert和confirm的美化  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  如何用虚拟主机快速搭建网站?详细步骤解析  如何用AWS免费套餐快速搭建高效网站?