zoukankan      html  css  js  c++  java
  • Winform等待窗口的实现(附源代码)

    在开发Winform程序的时候,经常会用到等待窗口(如网络通讯、数据库连接等需要一定时间来执行的操作),这样可以给用户提供更好的体验。

             等待窗口的主要功能是一边执行需要等待的操作,一边显示一个等待界面。当执行完毕时等待界面消失。用户可以提前取消操作,还可以设置操作的最大等待时间,若超过指定时间仍没完成操作可结束当前操作。等待窗口的操作处理内容可用λ表达式,在后面的应用实例中可看到使用方法。

             实现界面如下图:

     

             等待界面主要包含的部分:

    • 等待图片;
    • 等待消息文字("正在处理数据,请稍后..."):可自定义;
    • 计时器:可设置不显示;
    • 取消返回按钮:可设置不显示;
    • 另外等待窗口显示和关闭的时候都有渐变的一个简单特效,等待窗口的颜色是在一定范围内随即的。

    等待窗口实现代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WinForm_Test
    {
        public partial class frmWaitingBox : Form
        {
            #region Properties
            private int _MaxWaitTime;
            private int _WaitTime;
            private bool _CancelEnable;
            private IAsyncResult _AsyncResult;
            private EventHandler<EventArgs> _Method;
            private bool _IsShown = true;
            private readonly int _EffectCount = 10;
            private readonly int _EffectTime = 500;
            /// <summary>
            /// 控制界面显示的特性
            /// </summary>
            private Timer _Timer;
            public string Message { get; private set; }
            public int TimeSpan { get; set; }
            public bool FormEffectEnable { get; set; }
            #endregion
    
            #region frmWaitingBox
            public frmWaitingBox(EventHandler<EventArgs> method,int maxWaitTime,string waitMessage,bool cancelEnable,bool timerVisable)
            {
                maxWaitTime *= 1000;
                Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable);
            }
            public frmWaitingBox(EventHandler<EventArgs> method)
            {
                int maxWaitTime=60*1000;
                string waitMessage = "正在处理数据,请稍后...";
                bool cancelEnable=true;
                bool timerVisable=true;
                Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable);
            }
            public frmWaitingBox(EventHandler<EventArgs> method, string waitMessage)
            {
                int maxWaitTime = 60 * 1000;
                bool cancelEnable = true;
                bool timerVisable = true;
                Initialize(method, maxWaitTime, waitMessage, cancelEnable, timerVisable);
            }
            public frmWaitingBox(EventHandler<EventArgs> method, bool cancelEnable, bool timerVisable)
            {
                int maxWaitTime = 60*1000;
                string waitMessage = "正在处理数据,请稍后...";
                Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable);
            }
            #endregion
    
            #region Initialize
            private void Initialize(EventHandler<EventArgs> method, int maxWaitTime,string waitMessage,bool cancelEnable, bool timerVisable)
            {
                InitializeComponent();
                //initialize form
                this.FormBorderStyle = FormBorderStyle.None;
                this.StartPosition = FormStartPosition.CenterParent;
                this.ShowInTaskbar = false;
                Color[] c = GetRandColor();
                this.panel1.BackColor = c[0];
                this.BackColor = c[1];
                this.labMessage.Text = waitMessage;
                _Timer = new Timer();
                _Timer.Interval = _EffectTime/_EffectCount;
                _Timer.Tick += _Timer_Tick;
                this.Opacity = 0;
                FormEffectEnable = true;
                //para
                TimeSpan = 500;
                Message = string.Empty;
                _CancelEnable = cancelEnable;
                _MaxWaitTime = maxWaitTime;
                _WaitTime = 0;
                _Method = method;
                this.pictureBoxCancel.Visible = _CancelEnable;
                this.labTimer.Visible = timerVisable;
                this.timer1.Interval = TimeSpan;
                this.timer1.Start();
            }
            #endregion
    
            #region Color
            private Color[] GetRandColor()
            {
                int rMax = 248;
                int rMin = 204;
                int gMax = 250;
                int gMin = 215;
                int bMax = 250;
                int bMin = 240;
                Random r = new Random(DateTime.Now.Millisecond);
                int r1 = r.Next(rMin, rMax);
                int r2 = r1 + 5;
                int g1 = r.Next(gMin, gMax);
                int g2 = g1 + 5;
                int b1 = r.Next(bMin, bMax);
                int b2 = b1 + 5;
                Color c1 = Color.FromArgb(r1, g1, b1);
                Color c2 = Color.FromArgb(r2, g2, b2);
                Color[] c = { c1, c2 };
                return c;
            }
            #endregion
    
            #region Events
            private void btnCancel_Click(object sender, EventArgs e)
            {
                this.Message = "您结束了当前操作!";
                this.Close();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                _WaitTime += TimeSpan;
                this.labTimer.Text = string.Format("{0}秒", _WaitTime / 1000);
                if (!this._AsyncResult.IsCompleted)
                {
                    if (_WaitTime > _MaxWaitTime)
                    {
                        Message = string.Format("处理数据超时{0}秒,结束当前操作!", _MaxWaitTime / 1000);
                        this.Close();
                    }
                }
                else
                {
                    this.Message = string.Empty;
                    this.Close();
                }
                
            }
    
            private void frmWaitingBox_Shown(object sender, EventArgs e)
            {
                _AsyncResult = _Method.BeginInvoke(null, null, null, null);
                //Effect
                if (FormEffectEnable)
                {
                    _Timer.Start();
                }
                else
                    this.Opacity = 1;
            }
            private void frmWaitingBox_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (FormEffectEnable)
                {
                    if(this.Opacity>=1)
                        e.Cancel = true;
                    _Timer.Start();
                }
            }
            private void _Timer_Tick(object sender, EventArgs e)
            {
                if (_IsShown)
                {
                    if (this.Opacity >= 1)
                    {
                        _Timer.Stop();
                        _IsShown = false;
                    }
                    this.Opacity += 1.00 / _EffectCount;
                }
                else
                {
                    if (this.Opacity <= 0)
                    {
                        _Timer.Stop();
                        _IsShown = true;
                        this.Close();
                    }
                    this.Opacity -= 1.00 / _EffectCount;
                }
            }
            #endregion
    
            
        }
    }
    
    

    应用实例代码:

               string res;
                DataTable dt=null;
                frmWaitingBox f = new frmWaitingBox((obj,args)=>
                    {
                        Thread.Sleep(5000);
                        string sql = "SELECT * FROM [test].[dbo].[studentInfo]";
                        SQLHelper sqlHelper=new SQLHelper();
                        dt = sqlHelper.ExecuteSqlStr(sql,out res);
                    });
                f.ShowDialog(this);
    
                dataGridView1.DataSource = dt;
    

    源码下载:下载地址——(https://files.cnblogs.com/anding/WinForm_Test1.rar)

  • 相关阅读:
    PHP中的类函数和类对象
    PHP魔术方法__clone()篇
    PHP魔术方法__tostring()篇
    PHP魔术方法__call()篇
    自己写的PHP的mql类
    PHP的分页
    ThinkPHP的调用css,js和图片的路径
    JavaScript作用域链
    在Eclipse中开发WEB项目
    eclipse官方网址、各个版本的下载
  • 原文地址:https://www.cnblogs.com/anding/p/1845251.html
Copyright © 2011-2022 走看看