小东西WinForm的等待窗口

一般在做WinForm应用时会遇到较长时间的用户操作等待,此时最好加个等待窗口,给用户一个良好的操作体验.

太懒本来想在网上找一个代码的,但没找到合适的,只能自己动手写一个了,附上代码,也给自己做个备份

包括一个private的内建等待窗口类,及一个public的WaitForm类

WaitForm类提供Show及Close两个方法,代码中等待窗口不为模式窗口

在应用中需要操作长时间运作时可用下面的模式调用:

WaitForm.Show(this);//显示等待窗口

DoSomthing();//主窗口长时间操作

WaitForm.Close();//关闭等待窗口

 

这段代码主要应用了多线程方式完成,使用一个AutoResetEvent事件信号量来做窗口状态处理,并增保证了等待窗口在异常关闭的情况下能正确的退出显示线程.

 

ContractedBlock.gif ExpandedBlockStart.gif Code
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;
using System.Threading;
namespace BMSAP.Windows
{
  
ContractedBlock.gif ExpandedBlockStart.gif
class FrmWait : Form
    {
        
/// <summary>
        
/// Required designer variable.
        
/// </summary>
        private System.ComponentModel.IContainer components = null;
        
/// <summary>
        
/// Clean up any resources being used.
        
/// </summary>
        
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            
if (disposing && (components != null))
            {
                components.Dispose();
            }
            
base.Dispose(disposing);
        }
        
#region Windows Form Designer generated code

        
/// <summary>
        
/// Required method for Designer support - do not modify
        
/// the contents of this method with the code editor.
        
/// </summary>
        private void InitializeComponent()
        {
            
this.label1 = new System.Windows.Forms.Label();
            
this.SuspendLayout();
            
// 
            
// label1
            
// 
            this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
            
this.label1.Font = new System.Drawing.Font("Microsoft YaHei", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            
this.label1.Location = new System.Drawing.Point(00);
            
this.label1.Name = "label1";
            
this.label1.Size = new System.Drawing.Size(38660);
            
this.label1.TabIndex = 0;
            
this.label1.Text = "正 在 处 理 请 稍 候 ";
            
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            
// 
            
// FrmWait
            
// 
            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
            
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            
this.ClientSize = new System.Drawing.Size(38660);
            
this.ControlBox = false;
            
this.Controls.Add(this.label1);
            
this.Font = new System.Drawing.Font("Microsoft YaHei", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            
this.Margin = new System.Windows.Forms.Padding(4444);
            
this.Name = "FrmWait";
            
this.ShowIcon = false;
            
this.ShowInTaskbar = false;
            
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            
this.ResumeLayout(false);

        }

        
#endregion
        
private System.Windows.Forms.Label label1;
        
public FrmWait()
        {
            InitializeComponent();
        }
    }

    
public   delegate   void  ExecutedInvokeHeandle();

    
///   <summary>
    
///  等待窗口
    
///   </summary>
     public   class  WaitForm
    {
        
///   <summary>
        
///  等待窗口对象
        
///   </summary>
         static  FrmWait mWait;
        
///   <summary>
        
///  事件状态通知
        
///   </summary>
         static  AutoResetEvent mEvents;
        
///   <summary>
        
///  显示状态
        
///   </summary>
         static   bool  mShowing  =   false ;
        
///   <summary>
        
///  等待状态
        
///   </summary>
         static   bool  mWaiting  =   false ;
        
static  WaitForm()
        {
            
// 全局等待信号
            mEvents  =   new  AutoResetEvent( false );
        }
        
///   <summary>
        
///  窗口关闭事件
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         static   void  WaitForm_FormClosed( object  sender, FormClosedEventArgs e)
        {

            
if  (mWaiting  ||   ! (sender  is  FrmWait))
            {
                
// 信号等待中被异常关闭,或主窗口被关闭时自动通知信号复位
                mEvents.Set();
                
return ;
            }
            mShowing 
=   false ;
            
// 回收等待窗口
             try
            {
                mWait.Dispose();
            }
            
finally
            {
                mWait 
=   null ;
            }
        }
        
///   <summary>
        
///  显示等待窗口
        
///   </summary>
        
///   <param name="pComponet"> 调用对象,可为控件或窗口 </param>
         public   static   void  Show(Control pComponet)
        {
            
// 已显示则返回
             if  (mShowing)
                
return ;
            
// 创建等待窗口
            mWait  =   new  FrmWait();
            
// 设置窗口关闭事件
            mWait.FormClosed  +=   new  FormClosedEventHandler(WaitForm_FormClosed);
            
// 启动显示线程
            Thread tmpThread  =   new  Thread(show);
            tmpThread.Start(pComponet);
        }
        
///   <summary>
        
///  关闭等待窗口
        
///   </summary>
         public   static   void  Close()
        {

            
if  (mShowing)
                
// 如果显示中则设置关闭信号
                mEvents.Set();
            
// 修改等待状态
            mWaiting  =   false ;
        }
        
///   <summary>
        
///  显示窗口过程
        
///   </summary>
        
///   <param name="pComponet"></param>
         static   void  show( object  pComponet)
        {
            
if  (pComponet  !=   null   &&
                pComponet 
is  Control)
            {
                
// 设置显示状态
                mShowing  =   true ;
                
// 当调用对象为Win控件时
                (pComponet  as  Control).BeginInvoke( new  ExecutedInvokeHeandle( delegate ()
                {
                    
// 进行异步调用
                     if  (pComponet  !=   null   &&
                        pComponet 
is  Control)
                    {
                        
// 显示等待窗口
                        mWait.Show((pComponet  as  Control).FindForm());
                        
// 设置父级窗口关闭事件
                        (pComponet  as  Control).FindForm().FormClosed  +=   new  FormClosedEventHandler(WaitForm_FormClosed);
                        
// 激活父级窗口,
                        (pComponet  as  Control).FindForm().Activate();
                    }
                    
else
                    {
                        
// 如查询不到父级窗口设置顶层显示,此处可用GetDesktop的API来获取桌面窗口,并设置为父级窗口
                        mWait.TopMost  =   true ;
                        
// 显示等待窗口
                        mWait.Show();
                    }
                }));
                
// 设置等待信号
                mWaiting  =   true ;
                mEvents.WaitOne();
                
// 等待结束
                mWaiting  =   false ;
                (pComponet 
as  Control).BeginInvoke( new  ExecutedInvokeHeandle( delegate ()
                {
                    
// 关闭窗口
                    mWait.Close();
                }));

            }
        }
    }
}

 

 

 

转载于:https://www.cnblogs.com/pvistely/archive/2009/11/27/1611718.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值