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免费套餐快速搭建高效网站?

