zoukankan      html  css  js  c++  java
  • winfrom创建转圈等待窗体

    第一步:创建一个WaitForm

    public partial class WaitForm : Form
        {
            private int count = -1;
            private ArrayList images = new ArrayList();
            public Bitmap[] bitmap = new Bitmap[8];
            private int _value = 1;
            private Color _circleColor = Color.Red;
            private float _circleSize = 0.8f;
            private bool disposed = false;
            public WaitForm()
            {
                InitializeComponent();
                Instance = this;
                ShowInTaskbar = false;
            }
    
            public Color CircleColor
            {
                get { return _circleColor; }
                set
                {
                    _circleColor = value;
                    Invalidate();
                }
            }
    
            public float CircleSize
            {
                get { return _circleSize; }
                set
                {
                    if (value <= 0.0F)
                        _circleSize = 0.05F;
                    else
                        _circleSize = value > 4.0F ? 4.0F : value;
                    Invalidate();
                }
            }
    
            public Bitmap DrawCircle(int j)
            {
                const float angle = 360.0F / 8; Bitmap map = new Bitmap(200, 200);
                Graphics g = Graphics.FromImage(map);
    
                g.TranslateTransform(300 / 2.0F, 300 / 2.0F);
                g.RotateTransform(angle * _value);
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = SmoothingMode.AntiAlias;
                int[] a = new int[8] { 25, 50, 75, 100, 125, 150, 175, 200 };
                for (int i = 1; i <= 8; i++)
                {
                    int alpha = a[(i + j - 1) % 8];
                    Color drawColor = Color.FromArgb(alpha, _circleColor);
                    using (SolidBrush brush = new SolidBrush(drawColor))
                    {
                        float sizeRate = 3.5F / _circleSize;
                        float size = 300 / (6 * sizeRate);
    
                        float diff = (300 / 10.0F) - size;
    
                        float x = (300 / 80.0F) + diff;
                        float y = (300 / 80.0F) + diff;
                        g.FillEllipse(brush,x,y, size, size);
                        g.RotateTransform(angle);
                    }
                }
                return map;
            }
    
    
            public void Draw()
            {
                for (int j = 0; j < 8; j++)
                {
                    bitmap[7 - j] = DrawCircle(j);
                }
            }
            protected override void OnResize(EventArgs e)
            {
                SetNewSize();
                base.OnResize(e);
            }
    
            protected override void OnSizeChanged(EventArgs e)
            {
                SetNewSize();
                base.OnSizeChanged(e);
            }
    
            private void SetNewSize()
            {
                int size = Math.Max(Width, Height);
                Size = new Size(size, size);
            }
    
            public void set()
            {
                for (int i = 0; i < 8; i++)
                {
                    Draw();
    
                    //Bitmap map = new Bitmap((bitmap[i]), new Size(300, 300));
    
                    images.Add(bitmap[i]);
                }
                pictureBoxWait.Image = (Image)images[0];
                pictureBoxWait.Size = pictureBoxWait.Image.Size;
    
            }
            private void pictureBox_Click(object sender, EventArgs e)
            {
                this.Visible = false;
                base.Dispose();
            }
    
            private void Timer_Tick(object sender, EventArgs e)
            {
                Invoke(new Action(() =>
                {
                    foreach (Bitmap item in bitmap)
                    {
                        if (item != null)
                        {
                            item.Dispose();
                        }
                    }
                    images.Clear();
                    set();
                    count = (count + 1) % 8;
                    pictureBoxWait.Image = (Image)images[count];
                }));
               
    
            }
            public  void ShowForm()
            {
                Invoke(new Action(() =>
                {
                    Activate();
                    Show();
                }));
            }
            public void StopWait()
            {
                Invoke(new Action(() => { Hide(); }));
    
            }
            private void button1_Click(object sender, EventArgs e)
            {
                this.Visible = false;
                base.Dispose();
            }
            public static WaitForm Instance = null;
            private void WaitForm_Load(object sender, EventArgs e)
            {
                Invoke(new Action(() =>
                { 
                    
                    pictureBoxWait.Left = Width / 2 - 150;
                    pictureBoxWait.Top = Height / 2 - 150;
                    pictureBoxWait.Width = 300;
                    pictureBoxWait.Height = 300;
                }));
                
            }
    
            private void WaitForm_KeyDown(object sender, KeyEventArgs e)
            {
                Invoke(new Action(() =>
                {
                    if (e.KeyCode == Keys.T)
                    {
                        this.Close();
                    }
                }));
                
    
            }
        }

    第二步:使用方法

    在MainForm 初始化地方开启线程调用

      tdWait = new Thread(() => { Application.Run(new WaitForm()); });
      tdWait.IsBackground = true;
      tdWait.Start();

    第三步:在需要使用的地方使用

    WaitForm.Instance.ShowForm();
    AppointModels appModels = new AppointModels();
    ResultModels result = HISManager.DownloadAppointData(JsonConvert.SerializeObject(appModels));
    WaitForm.Instance.StopWait();

    第四步:在MainForm Close 的地方关闭线程

     if (tdWait != null)
     {
         tdWait.Abort();
         tdWait = null;
     }
  • 相关阅读:
    什么是Redis?简述它的优缺点?
    2021年最新盘点数据库MySql笔试题
    网易CTO:70%.NET开发,遇到这个问题就怂!
    近200篇机器学习&深度学习资料分享【转载】
    【转】为什么0.1无法被二进制小数精确表示?
    【Leetcode-easy】Remove Element
    【Leetcode-easy】Remove Duplicates from Sorted Array
    【LeetCode-easy】Merge Two Sorted Lists
    【Leetcode-easy】Valid Parentheses
    【Leetcode-easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/techdreaming/p/10875313.html
Copyright © 2011-2022 走看看