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(& ...
随机推荐
- [ActionScript3.0] AS3利用ExternalInterface与js通信
AS3代码,可做文档类; package { import flash.display.Sprite; import flash.events.*; import flash.external.Ext ...
- [Objective-C语言教程]动态绑定(32)
动态绑定确定在运行时而不是在编译时调用的方法. 动态绑定也称为后期绑定. 在Objective-C中,所有方法都在运行时动态解析.执行的确切代码由方法名称(选择器)和接收对象确定. 动态绑定可实现多态 ...
- mxonline实战8,机构列表分页功能,以及按条件筛选功能
对应github地址:列表分页和按条件筛选 一. 列表分页 1. pip install django-pure-pagination 2. settings.py中 install ...
- Java初学者的学习路线建议
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...
- 解决self.encoding = charset_by_name(self.charset).encoding
解决self.encoding = charset_by_name(self.charset).encoding def createMysqlTable(tablename): # config = ...
- day5:python学习之集合
0. 集合的作用及特点 集合具有去重和关系测试两大作用,它具有无序的特点. list1 = [1,2,3,4,5,7,6,8,6,4] list1 = set(list1) print(list1) ...
- appium+python 存在多个类时,不用每次都初始化解决办法
appium+python写自动化测试用例时,为了代码的可维护性,分成不同的类是很常见的办法, 但是在运行时,每一个类都要初始化一次,即每次都会重启应用,这很麻烦,通过__new__可进行多个类之间的 ...
- 我也学习JAVA多线程-join
在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...
- [BZOJ 5155][Tjoi2014]电源插排
传送门 网上大部分题解都写得是动态开点线段树,然而像\(MiEcoku\)这么懒惰的显然不会去写线段树... \(\color{green}{solution}\) 我们考虑来点骚操作. 线段树维护的 ...
- noip rp++
from JOKER-Y