C#如何實現loading提示控制項簡單的實例

2019-10-19     科技i關注

本文通過實例代碼給大家介紹了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);

List colors = new List();

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提示控制項簡單的實例的詳細內容,更多請關注其它相關文章!

更多技巧請《轉發 + 關注》哦!

文章來源: https://twgreatdaily.com/zh-tw/ZLO34G0BMH2_cNUghZMt.html