zoukankan      html  css  js  c++  java
  • 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<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);
                }
            }
        }
    }
  • 相关阅读:
    循环图片 yi
    给大家一个经典的.net情感故事 yi
    [东邪西毒][程序员版][原版][剧情] yi
    Sqlite 使用笔记 中文显示为乱码 yi
    sql2005安装过程,(不装C盘) yi
    Visual Studio 2010 美女与程序员的爱情网剧全集 yi
    IT行业几大职业病 yi
    标准化操作
    【ActiveMQ Tuning】Serializing to Disk
    我的山寨敏捷四季之春
  • 原文地址:https://www.cnblogs.com/onegarden/p/7468730.html
Copyright © 2011-2022 走看看