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);
      }
    }
  }
}

总结

以上所述是小编给大家介绍的C#实现简单的loading提示控件实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • C#实现多选项卡的浏览器控件

    本文详细为大家分享了C#多选项卡的浏览器控件的设计与实现,供大家参考,具体内容如下 1.  为什么我们需要多选项卡的浏览器控件 项目中需要使用WinForm应用程序来包装BS应用程序的浏览器外壳,在.NET的WebBrowser中没有多选项卡浏览的自带配置属性,我们需要实现多选项卡的浏览器控件来实现包装BS应用程序的目的,而不会弹出IE浏览器窗口. 2. 我们需要了解哪些知识点 2.1.     WebBrowser控件 WebBrowser 控件为 WebBrowser ActiveX 控件提

  • C#实现DataGridView控件行列互换的方法

    本文实例讲述了C#实现DataGridView控件行列互换的方法.分享给大家供大家参考.具体如下: 该示例程序是一个Windows窗体应用程序,有左右两个DataGridView控件:dgvLeft和dgvRight dgvRight除时间外的每一行是dgvLeft的一列 private void Form1_Load(object sender, EventArgs e) { //C#中确定控件DataGridView根据内容自动调整列宽长度的属性 //是AutoSizeColumnsMode

  • C#实现用户自定义控件中嵌入自己的图标

    本文实例讲述了C#实现用户自定义控件中嵌入自己的图标.分享给大家供大家参考,具体如下: 下面给出一下具体的步骤. 1. 新建一个用户控件 2. 向资源文件是添加一张图片,图片格式可以是bm,ico 大小最好是 16 * 16 啦! 3. 选中用户控件图标,单击"右键>属性"把 "生成操作 的属性值改为:嵌入的资源(Action Resource) 4. 第四步: [ToolboxBitmap(typeof(CutPitureNew_WPF), "CutPitu

  • C#后台创建控件并获取值的方法

    本文实例讲述了C#后台创建控件并获取值的方法.分享给大家供大家参考.具体实现方法如下: 前台代码: 复制代码 代码如下: <form id="form1" runat="server">     <div>         <div class="item">             Please input a number:             <asp:TextBox runat="s

  • C#多线程与跨线程访问界面控件的方法

    本文实例讲述了C#多线程与跨线程访问界面控件的方法.分享给大家供大家参考.具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象.启用新线程去访问WebService是一个可行的方法. 典型的,有下面的启动新线程示例: 复制代码 代码如下: private void LoadRemoteAppVersion()  {      if (FileName.Text.Trim() == "") return;      StatusLabel

  • C#实现读取DataSet数据并显示在ListView控件中的方法

    本文实例讲述了C#实现读取DataSet数据并显示在ListView控件中的方法.分享给大家供大家参考.具体如下: /*lvStudentList为ListView控件名 */ DataSet ds = new DataSet(); ds = student.QueryStudents(); //查询表的信息 int rowCount, columnCount,i,j; rowCount = ds.Tables[0].Rows.Count; columnCount = ds.Tables[0].

  • C#日期控件datetimepicker保存空值的三种方法

    方法一(推荐): 设置datetimepicker的属性ShowCheckBox为true 在窗口初始化时候,添加代码this.datetimepicker1.Checked = false; 保存日期值入库的时候,就可以根据if(this.datetimepicker1.Checked ==false),保存空值. 方法二: 在窗口初始化函数中添加: 复制代码 代码如下: this.dateTimePicker1.Format=DateTimePickerFormat.Custom; this

  • C#使用Aspose.Cells控件读取Excel

    Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的功能,读取Excel的数据并导入到Dataset或数据库中.读取Excel表格数据的代码如下: 首先要引入命名空间:using Aspose.Cells; 复制代码 代码如下: Workbook workbook = new Workbook(); workbook.Open("C:\\test.x

  • C# Winform 子窗体访问父级窗体的控件和属性

    今天在做一个联系人管理的C#设计时,遇到了这个问题,我需要将父窗体中的textBox中的值传到子窗体并进行数据库查询操作,我用了new 父窗体().textBox.text;来进行值传递,然而并无卵用,经过多次试验,找到了一个比较简单的解决方法: 一.子窗体调用父窗体的静态变量 父窗体:Logout 子窗体:Affirm 父窗体文本框:tB_Logout_Username public partial class Logout : Form { //定义一个静态变量存放父窗体中的文本框的值 pu

  • 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

  • vue递归组件实战之简单树形控件实例代码

    1.递归组件-简单树形控件预览及问题 在编写树形组件时遇到的问题: 组件如何才能递归调用? 递归组件点击事件如何传递? 2.树形控件基本结构及样式 <template> <ul class="vue-tree"> <li class="tree-item"> <div class="tree-content"><!--节点内容--> <div class="expand-

  • Android 底部导航控件实例代码

    一.先给大家展示下最终效果 通过以上可以看到,图一是简单的使用,图二.图三中为结合ViewPager共同使用,而且都可以随ViewPager的滑动渐变色,不同点是图二为选中非选中两张图片,图三的选中非选中是一张图片只是做了颜色变化. 二. 需求 我们希望做可以做成这样的,可以在xml布局中引入控件并绑定数据,在代码中设置监听回调,并且配置使用要非常简单! 三.需求分析 根据我们多年做不明确需求项目的经验,以上需求还算明确.那么我们可以采用在LinearLayout添加子View控件,这个子Vie

  • Android自定义顶部导航栏控件实例代码

    下面一段代码给大家介绍了android 自定义顶部导航栏控件功能,具体代码如下所示: class HeaderBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { //重写构造方法 在java里面 我们一般是重写三个构造方法//在kotlin中 我们可以使用

  • 一个简单的JS时间控件示例代码(JS时分秒时间控件)

    自己在网上找了半天没找到只有 "时分秒"的控件, 就自己做了个,发在这里方便有人用到 鼠标点击 后 的效果 SetTime.js 复制代码 代码如下: /**//************************************ 使用说明:* 首先把本控件包含到页面 * <script src="XXX/setTime.js" type="text/javascript"></script>* 控件调用函数:_Set

  • 安卓自定义流程进度图控件实例代码

    先上效果图: 如图,可实现设置:总流程数.已完进度程数.已完成颜色,各个标题 github地址戳这里 使用方法 1.导入compile 'com.github.pavlospt:circleview:1.3'依赖包(因为用到了CircleView) 2.直接把下面两个文件一个java一个xml,复制粘贴进项目(代码放在了文章最后,暂时还没弄成开源库,有时间直接做成依赖包倒进去) 在xml中写入ProcessImg控件 在java文件中实例化ProcessImg对象 根据需要调用几个方法 1.对象

  • Android实现一个丝滑的自动轮播控件实例代码

    前言 现在很多的 App 都有自动轮播的 banner 界面,用于展示广告图片或者显示当前比较热门的一些活动,除了具备比较酷炫的效果之外,通过轮播的方式来减少对界面的占用,也是很赞的一个设计点.本文主要是总结自动轮播控件的实现过程,以及对这类控件的一些优化的技巧. 一.如何实现 在开始进行我们的代码编程之前,我们先要思考一下,在 Google 提供的官方 Api 里面,有没有类似的控件实现了相似的功能,毕竟官方的控件大都经过了时间的考验,无论是稳定性还是性能方面都是非常不错的,如果我们能够基于官

  • Android实现万能自定义阴影控件实例代码

    目录介绍 01.阴影效果有哪些实现方式 02.实现阴影效果Api 03.设置阴影需要注意哪些 04.常见Shape实现阴影效果 05.自定义阴影效果控件 06.如何使用该阴影控件 07.在recyclerView中使用注意点 01.阴影效果有哪些实现方式 阴影效果有哪些实现方式 第一种:使用CardView,但是不能设置阴影颜色 第二种:采用shape叠加,存在后期UI效果不便优化 第三种:UI切图 第四种:自定义View 否定上面前两种方案原因分析? 第一个方案的CardView渐变色和阴影效

  • 在WPF中动态加载XAML中的控件实例代码

    本文实例讲述了在WPF中动态加载XAML中的控件的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using S

  • Android实现滑动选择控件实例代码

    前言 最近做了个滑动选择的小控件,拿出来给大家分享一下,先上图 运行效果 实现步骤 这里分解为3个动作:Down.Move.Up来进行分析,博主文采不好,大家直接看流程图吧!! 代码分析 前置知识 1.这个地方使用的是RecyclerView的代码,使用RecyclerView只能使用LinearLayoutManager,ListView的运行效果稍微要比RecyclerView差一些 //这里使用dispatchTouchEvent,因为onTouchEvent容易被OnTouchListe

随机推荐