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);
            }
        }
    }
}
时间: 2024-08-09 06:22:03

C# 简单的loading提示控件的相关文章

iOS8统一的系统提示控件——UIAlertController

iOS8统一的系统提示控件——UIAlertController 一.引言 相信在iOS开发中,大家对UIAlertView和UIActionSheet一定不陌生,这两个控件在UI设计中发挥了很大的作用.然而如果你用过,你会发现这两个控件的设计思路有些繁琐,通过创建设置代理来进行界面的交互,将代码逻辑分割了,并且很容易形成冗余代码.在iOS8之后,系统吸引了UIAlertController这个类,整理了UIAlertView和UIActionSheet这两个控件,在iOS中,如果你扔使用UIA

jquery messagetip信息语提示控件

编写原因: 作为提示框,jquery有个messagebox的控件,也就是弹出的提示框.但这个控件如果不是用在需要确认的时候,单单警告提示.消息提示.失败提示时,用户还需要去点下确认,有时这操作还是挺烦的(尽管可以设置timeout,会自动消失). 控件需求: 现在需要一个简洁消息提示控件,不需确认. 1.提示框可以从顶部或底部滑入,在失效后滑出. 2.可以设置滑入时间,内容停留时间.滑出时间. PS:比较简单的控件 效果如下 编写过程: 1.在无文档的情况下, 我建议将用户能传的参数的定义写在

iOS项目开发实战——自定义圆形进度提示控件

iOS中默认的进度条是水平方向的进度条,这往往不能满足我们的需求.但是我们可以自定义类似的圆形的进度提示控件,主要使用iOS中的绘图机制来实现.这里我们要实现一个通过按钮点击然后圆形进度提示不断增加的效果. (1)新建一个Cocoa Touch Class,注意要继承自UIView.这个是绘制图形的类,绘制一个圆形的背景和扇形的进度.具体实现如下: import UIKit class ProgressControl: UIView { override init(frame: CGRect)

(转)sl简单自定义win窗体控件

sl简单自定义win窗体控件 相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个 而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学sl的朋友在学习自定义控件时有帮助. 首先先明确下两个概念用户控件和模板化控件. 用户控件是继承UserControl而来的控件,由于UserControl不支持模板,所以它只能用于组合现有控件件而不能用于设计可定制外观的控件. 模板化控件是继承自ContentControl, Control等支持模板的而来的

jquery的智能提示控件

福利到~分享一个基于jquery的智能提示控件intellSeach.js 一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户使用.说白了,就是用户边输入,系统会提示相关的结果:或者,当用户点击搜索框时,就推荐一些内容,如360.百度都会提示今天的主要新闻或搜索量大的内容. jquery 已经有一个这样的插件了,叫 autocomplete, 但我

RS开发日期提示控件默认为昨天之进阶篇

时隔<RS开发日期提示控件默认为昨天>这篇博文已经很久了,请原谅我隔了这么久才继续来写这篇笔记.也希望读到这篇笔记的朋友可以从这篇笔记中学习到一些关于RS日期控件和JS的一些应用知识,当然这也可以为给业务部门做月报的同学提供一个高易用性的日期处理办法. 1:确保报表有提示页面,提示页面提供了给日期提示控件设置默认值为昨天的功能 2:确保[日期维度].[日]的key值格式为2009-01-01 yyyy-mm-dd 3:确保[事实].[日期]的格式为2009-01-01 yyyy-mm-dd 4

iOS自定义一些提示控件

代码如下: .h中的代码: // // HKUIToolsView.h // HKUIToolsDemo // // Created by isHakan on 2017/7/28. // Copyright ? 2017年 liuhuakun. All rights reserved. // #import <UIKit/UIKit.h> @interface HKUIToolsView : UIView /*移除加载类型的view */ - (void)removeLoadViewFrom

基于js 的自动提示控件

最近在工作中需要自动提示的功能,本身单独的这个控件来开发难度不是很大,特别是针对项目需求对应的单一功能,但是为了让开发出的控件可以随意使用,动态配置,那么这就需要一定的时间来开发了. 先说一下我们这个自动提示的功能的要求,在input控件中输入一些值,在对应的下方会有对应合适的选项,类似百度自动提示的功能.我的这个控件为了可以在很多地方可以不做修改的进行引入,所以支持方法配置,样式配置,不需要任何其他js库,使用ajax实现等功能,在调用的时候只需一个div 给出对应的id和方法名就可以的,还可

定时显示提示控件 TToolTip

转载过来的,文章出自: http://www.delphifans.com/infoview/Article_3640.html {    修改者:ghs    日期:20071218    功能:在原版本的基础上增加.          RegisterControl:注册需要提示的控件.          BeginHelp:设置光标状态为帮助crHelp:          鼠标弹起后,显示注册的提示信息,同时光标进行还原.             原版本   作者:thaoqi   出处