C#如何实现loading提示控件简单的实例
导读:收集整理的这篇文章主要介绍了C#如何实现loading提示控件简单的实例,觉得挺不错的,现在分享给大家,也给大家做个参考。本文通过实例代码给大家介绍了C#实现简单的loading提示控件功能,代码非常简单,具有参考借鉴价值,需要的朋友参考下...
收集整理的这篇文章主要介绍了C#如何实现loading提示控件简单的实例,觉得挺不错的,现在分享给大家,也给大家做个参考。本文通过实例代码给大家介绍了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 = 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);
ListColor>
colors = new ListColor>
();
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提示控件简单的实例的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C#如何实现loading提示控件简单的实例
本文地址: https://pptw.com/jishu/592787.html
