自己画一个转圈圈的控件
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
相关文章:
内网网站制作软件,内网的网站如何发布到外网?
如何快速启动建站代理加盟业务?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
如何在云指建站中生成FTP站点?
建站之星如何配置系统实现高效建站?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
建站之星代理费用多少?最新价格详情介绍
建站之星后台密码遗忘如何找回?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在搬瓦工VPS快速搭建网站?
建站之星如何通过成品分离优化网站效率?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何快速生成高效建站系统源代码?
高端云建站费用究竟需要多少预算?
公司网站制作价格怎么算,公司办个官网需要多少钱?
建站之星多图banner生成与模板自定义指南
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
建站之星如何一键生成手机站?
如何通过VPS搭建网站快速盈利?
建站之星如何快速解决建站难题?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何在Tomcat中配置并部署网站项目?
,南京靠谱的征婚网站?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
网站制作公司,橙子建站是合法的吗?
,交易猫的商品怎么发布到网站上去?
北京制作网站的公司,北京铁路集团官方网站?
如何挑选最适合建站的高性能VPS主机?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何获取免费开源的自助建站系统源码?
如何用IIS7快速搭建并优化网站站点?
浅析上传头像示例及其注意事项
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
建站主机数据库如何配置才能提升网站性能?
如何通过VPS建站无需域名直接访问?
个人网站制作流程图片大全,个人网站如何注销?
招商网站制作流程,网站招商广告语?
如何快速搭建二级域名独立网站?
如何在宝塔面板中创建新站点?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何做静态网页,sublimetext3.0制作静态网页?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何通过wdcp面板快速创建网站?
网站微信制作软件,如何制作微信链接?
济南网站制作的价格,历城一职专官方网站?
TestNG的testng.xml配置文件怎么写
公司门户网站制作流程,华为官网怎么做?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何正确下载安装西数主机建站助手?
*请认真填写需求信息,我们会在24小时内与您取得联系。