我的鸡肋条之一: 仿CWaitCursor的应用

时间:2021-12-12 22:55:43

   在MFC中有这样一个类CWaitCursor。功能虽小,但是做UI的时候却是从来不会少用的。以至于用VC的时候会用自制的继承于CWaitCursor的CXXXWaitCursorEx类,用VB的时候,会自己做一个CWaitCursor,。。。。。。
   # 有关CWaitCursor的定义以及它本身的意义,如果您不清楚请参阅相关文档或者Google一下。
   # 应该很快就可以找到。

   到了.NET的时代,因为析构函数没有办法按照程序员的意愿在指定的时间发生,我似乎没有想的就在很早前否定了这个功能。其实在很早的时候也已经知道了Using这个东西,可惜事情没有经过大脑,只是想当然的,外加工作中也不用.NET,失之交臂。

   终于让我有机会在今天想起来这件事情,简单的做了一小段代码。

我的鸡肋条之一: 仿CWaitCursor的应用using  System;
我的鸡肋条之一: 仿CWaitCursor的应用
using  System.Windows.Forms;
我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用
namespace  Change.UI 
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用
{
我的鸡肋条之一: 仿CWaitCursor的应用    
public class WaitCursor : System.IDisposable
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用    
{
我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用        
private Form _target;
我的鸡肋条之一: 仿CWaitCursor的应用        
private bool _enabled;
我的鸡肋条之一: 仿CWaitCursor的应用        
private Cursor _cur;
我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用        
public WaitCursor ( Form target )
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用        
{
我的鸡肋条之一: 仿CWaitCursor的应用            _target 
= target;
我的鸡肋条之一: 仿CWaitCursor的应用            _enabled 
= _target.Enabled;
我的鸡肋条之一: 仿CWaitCursor的应用            _cur 
= _target.Cursor;
我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用            _target.Enabled 
= false;
我的鸡肋条之一: 仿CWaitCursor的应用            _target.Cursor 
= Cursors.WaitCursor;
我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用        }

我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用        
public void Dispose()
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用        
{
我的鸡肋条之一: 仿CWaitCursor的应用            
this.Release();
我的鸡肋条之一: 仿CWaitCursor的应用        }

我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用        
private void Release()
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用        
{
我的鸡肋条之一: 仿CWaitCursor的应用            
if!(_target == null) )
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用            
{
我的鸡肋条之一: 仿CWaitCursor的应用                _target.Enabled 
= _enabled;
我的鸡肋条之一: 仿CWaitCursor的应用                _target.Cursor 
= _cur;
我的鸡肋条之一: 仿CWaitCursor的应用            }

我的鸡肋条之一: 仿CWaitCursor的应用        }

我的鸡肋条之一: 仿CWaitCursor的应用    }

我的鸡肋条之一: 仿CWaitCursor的应用}

我的鸡肋条之一: 仿CWaitCursor的应用


使用方法:

我的鸡肋条之一: 仿CWaitCursor的应用         private   void  button1_Click( object  sender, System.EventArgs e)
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用        
{
我的鸡肋条之一: 仿CWaitCursor的应用            
using(Change.UI.WaitCursor wc = new Change.UI.WaitCursor(this))
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用            
{
我的鸡肋条之一: 仿CWaitCursor的应用                DateTime dt;
我的鸡肋条之一: 仿CWaitCursor的应用                dt 
= DateTime.Now;
我的鸡肋条之一: 仿CWaitCursor的应用                
while(true)
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用                
{
我的鸡肋条之一: 仿CWaitCursor的应用                    System.TimeSpan diff 
= DateTime.Now.Subtract(dt);
我的鸡肋条之一: 仿CWaitCursor的应用                    
if ( diff.Seconds > 3 )
我的鸡肋条之一: 仿CWaitCursor的应用                        
return;
我的鸡肋条之一: 仿CWaitCursor的应用                }

我的鸡肋条之一: 仿CWaitCursor的应用            }

我的鸡肋条之一: 仿CWaitCursor的应用        }

我的鸡肋条之一: 仿CWaitCursor的应用


注: 至于为什么不用Sleep等待结束,只是因为自己想尝试用一下TimeSpan。

   上面的代码至少在我这里工作的还不错,但是有下面两个问题。
   1. 在微软中文新闻组的DotNet.VB组(?)中有过类似的提问及解答。
       问题:在设置Form的Enabled的时候,内部的控件也变灰了。
       解决:使用
                 [DllImport("User32.dll")]
                 public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

  2.  在Form被禁止使用的时候点击Button,那么这个事件会被存在消息队列中。
       期望使用API可以解决这个问题,如果无法解决,不知道用.NET的方法要怎么样才能实时的响应该事件(也就是说让事件白发生?)

追记 [2004/09/16]

   如果利用上面的方法在Using Block中查错并对某Control设置焦点的话,会出现无法设置的情况。这点与VC中应该是一样的。作为解决办法一直以来我都是这样做的。

我的鸡肋条之一: 仿CWaitCursor的应用if  ( XXXX  ==  System.String.Empty )
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用
{
我的鸡肋条之一: 仿CWaitCursor的应用    XXXX.Focus();
我的鸡肋条之一: 仿CWaitCursor的应用    
return;
我的鸡肋条之一: 仿CWaitCursor的应用}

我的鸡肋条之一: 仿CWaitCursor的应用
using  ( Change.UI.WaitCursor wc  =   new  Change.UI.WaitCursor( this ) )
我的鸡肋条之一: 仿CWaitCursor的应用我的鸡肋条之一: 仿CWaitCursor的应用
{
我的鸡肋条之一: 仿CWaitCursor的应用    我的鸡肋条之一: 仿CWaitCursor的应用
我的鸡肋条之一: 仿CWaitCursor的应用}

我的鸡肋条之一: 仿CWaitCursor的应用