zoukankan      html  css  js  c++  java
  • Winform--实现加载数据时动态等待/加载效果

    最近在遇到数据加载耗时比较长,想用一个动态等待效果来告诉用户程序还没死,以下是实现过程。

    实现两种效果:一种条形进度条,不停滚动;一种有几个红点在动态循环。原本想上传视频更清楚一点,无奈不太会用,丢人了……

    第一种效果:

    条形进度条

    优势:极其简单,直接使用的是winform里面的控件—progressbar,将其style属性设置为Marquee,MarqueeAnimationSpeed属性定义其滚动速度。在合适的地方调用它就能实现功能了。该控件还可以跟BackGroundWorker配合使用,实时显示加载进度。

    缺点:太过依赖于控件了,我们都知道并不是所有时候都能用控件的,比如说progressbar能使用的平台是受限的(见MSDN)。

    问题:还不知道如何改变中间绿色滚动的宽度。

    第二种效果:

    红色转圈

    优势:仅使用picturebox、timer两种比较常见的控件,可替代性强。

    缺点:代码量要多一点,理解难度要大一点。

    问题:还没完全看懂代码,比如如何改变点的大小、形状等等。

    引用Drawing来绘制:

      1 using System.Drawing.Drawing2D;
      2 #region 等待界面
      3         private int count = -1;
      4         private ArrayList images = new ArrayList();
      5         public Bitmap[] bitmap = new Bitmap[8];
      6         private int _value = 1;
      7         private Color _circleColor = Color.Red;
      8         private float _circleSize = 0.8f;      
      9 
     10         private int width = 200;//设置圆的宽
     11         private int height = 200;////设置圆的高
     12 
     13         public Bitmap DrawCircle(int j)
     14         {
     15             const float angle = 360.0F / 8;
     16             Bitmap map = new Bitmap(150, 150);
     17             Graphics g = Graphics.FromImage(map);
     18 
     19             g.TranslateTransform(width / 2.0F, height / 2.0F);
     20             g.RotateTransform(angle * _value);
     21             g.InterpolationMode = InterpolationMode.HighQualityBicubic;
     22             g.SmoothingMode = SmoothingMode.AntiAlias;
     23             int[] a = new int[8] { 25, 50, 75, 100, 125, 150, 175, 200 };
     24             for (int i = 1; i <= 8; i++)
     25             {
     26                 int alpha = a[(i + j - 1) % 8];
     27                 Color drawColor = Color.FromArgb(alpha, _circleColor);
     28                 using (SolidBrush brush = new SolidBrush(drawColor))
     29                 {
     30                     float sizeRate = 3.5F / _circleSize;
     31                     float size = width / (6 * sizeRate);
     32                     float diff = (width / 10.0F) - size;
     33                     float x = (width / 80.0F) + diff;
     34                     float y = (height / 80.0F) + diff;
     35                     g.FillEllipse(brush, x, y, size, size);
     36                     g.RotateTransform(angle);
     37                 }
     38             }
     39             return map;
     40         }
     41 
     42         public void Draw()
     43         {
     44             for (int j = 0; j < 8; j++)
     45             {
     46                 bitmap[7 - j] = DrawCircle(j);
     47             }
     48         }
     49 
     50         protected override void OnResize(EventArgs e)
     51         {
     52             SetNewSize();
     53             base.OnResize(e);
     54         }
     55 
     56         protected override void OnSizeChanged(EventArgs e)
     57         {
     58             SetNewSize();
     59             base.OnSizeChanged(e);
     60         }
     61 
     62         private void SetNewSize()
     63         {
     64             int size = Math.Max(width, height);
     65             pictureBox.Size = new Size(size, size);
     66         }
     67 
     68         public void set()
     69         {
     70             for (int i = 0; i < 8; i++)
     71             {
     72                 Draw();
     73                 Bitmap map = new Bitmap((bitmap[i]), new Size(120, 110));
     74                 images.Add(map);
     75             }
     76             pictureBox.Image = (Image)images[0];
     77             pictureBox.Size = pictureBox.Image.Size;
     78         }
     79        
     80         private void Timer_Tick(object sender, EventArgs e)
     81         {
     82             set();
     83             count = (count + 1) % 8;
     84             pictureBox.Image = (Image)images[count];
     85         }
     86         
     87         private void StartWaiting()
     88         {
     89             timer1.Start();
     90             pictureBox.Visible = true;
     91 
     92             progressBar1.Visible = true;
     93             progressBar1.Enabled = true;
     94         }
     95 
     96         private void StopWaiting()
     97         {
     98             timer1.Stop();
     99             pictureBox.Visible = false;
    100 
    101             progressBar1.Visible = false;
    102             progressBar1.Enabled = false;
    103         }
    104 
    105         #endregion
    View Code

    代码参考:http://www.jb51.net/article/46069.htm

    需求加强对drawing类的学习,GDI绘制,动画效果等学习。

    后期如果使用更多的这种效果再来继续更新!

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/EasonDongH/p/7884341.html
Copyright © 2011-2022 走看看