C# 简单的loading提示控件
自己画一个转圈圈的控件
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 = ;
int curindex = ;
Timer timer;
int instervel = ;
string loadStr = "loading...."; public LoadControl()
{
InitializeComponent();
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint|ControlStyles.OptimizedDoubleBuffer, true);
this.MinimumSize = new Size(, );
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 ? : 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 = ;
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, ) + Math.Pow(ya - yb, ));
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 = ; 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 = ; 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, ), 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提示控件的更多相关文章
- jquery messagetip信息语提示控件
编写原因: 作为提示框,jquery有个messagebox的控件,也就是弹出的提示框.但这个控件如果不是用在需要确认的时候,单单警告提示.消息提示.失败提示时,用户还需要去点下确认,有时这操作还是挺 ...
- (转)sl简单自定义win窗体控件
sl简单自定义win窗体控件 相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个 而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...
- 气泡形提示控件grumble.js
grumble.js 是一个很特别的气泡形状提示控件,最开始是为 Huddle.com 网站开发的, 它没有通常的north/east/south/west的定位限制. 任何一个grumble都可以放 ...
- 重新想象 Windows 8 Store Apps (4) - 控件之提示控件: ProgressRing; 范围控件: ProgressBar, Slider
原文:重新想象 Windows 8 Store Apps (4) - 控件之提示控件: ProgressRing; 范围控件: ProgressBar, Slider [源码下载] 重新想象 Wind ...
- jquery的智能提示控件
福利到~分享一个基于jquery的智能提示控件intellSeach.js 一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管 ...
- 简单的表格json控件
简单的表格json控件 由于最近做的项目一直有表格的形式展示数据,所以想写个简单的关于表格方面的控件出来,想用JSON数据直接渲染出来,因为开发给到我们前端的字段可能会叫不同的名字,所以我们前端渲染页 ...
- RS开发日期提示控件默认为昨天之进阶篇
时隔<RS开发日期提示控件默认为昨天>这篇博文已经很久了,请原谅我隔了这么久才继续来写这篇笔记.也希望读到这篇笔记的朋友可以从这篇笔记中学习到一些关于RS日期控件和JS的一些应用知识,当然 ...
- iOS项目开发实战——自己定义圆形进度提示控件
iOS中默认的进度条是水平方向的进度条,这往往不能满足我们的需求. 可是我们能够自己定义类似的圆形的进度提示控件,主要使用iOS中的画图机制来实现. 这里我们要实现一个通过button点击然后圆形进度 ...
- Atitit. Toast alert loading js控件 atiToast v2新特性
Atitit. Toast alert loading js控件 atiToast v2新特性 1. 连续多个txt追加的原理 var txt = document.createElement(& ...
随机推荐
- NEST - How can i do multiple nested aggregation?
question: How can I do multiple nested aggregation? I have tried something like this: Aggregations(x ...
- [ActionScript 3.0] 记录几个ByteArray 十六进制 String等相互转换的方法
/** * 通过hax数据返回ByteArray * @param hax 格式 "AA5A000100FF" */ private function getHax(hax:Str ...
- YC全球总裁:我招揽陆奇好多年,如今终于如愿了!
简评:YC 老大多年来一直在努力招揽陆奇,终于如愿了. YC 总裁 Sam Altman 在 8 月 14 日,发布了关于陆奇以及 YC 中国的公告,全文如下: 我非常荣幸地宣布,陆奇加入 YC 并且 ...
- the type initializer for 'system.drawingcore.gdiplus' threw an exception
Centos 7 yum install libgdiplus-devel reboot之后生效 apt install libgdiplus cp /usr/lib/libgdiplus.so ~/ ...
- 常见的http错误提示
1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 (继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101 (切换协议 ...
- PHP获取时间比实际时间少8小时的问题
有两方法 1.我们写PHP程序在获取时间时,人为加上8小时(这种方法是最实用也是最土的方法) 2.如果直接获取正确时间,也可修改PHP的配置文件,即查找php.ini文件 修改方法:在php.ini文 ...
- Q239 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: 输入: nums ...
- ArduinoNano卡在上传,无法烧录
卡在“上传...”.过了很久被告知失败. 上午在开发版管理器中将Arduino AVR Boards从1.6.20升级到1.6.22,出现这个问题. 再安装回1.6.20,问题未被解决. 查阅资料无果 ...
- 5 个 iOS 和 Android 最佳的开源自动化工具[转]
自动化测试时下在产品测试上有着非常重要的作用.实现测试自动化有多种积极的方式,包括最大限度地减少测试执行时间:在关键的发布阶段,用更少的时间确保更大的覆盖范围:在产品开发阶段,可靠又重复性地运行以确保 ...
- AngularJs 指令实现选项卡
HTML: <body ng-controller="Aaa"> <my-tab my-id="div1" my-data="dat ...