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

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

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

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

using System;
using System.Windows.Forms;

namespace Change.UI 
{
    
public class WaitCursor : System.IDisposable
    
{

        
private Form _target;
        
private bool _enabled;
        
private Cursor _cur;

        
public WaitCursor ( Form target )
        
{
            _target 
= target;
            _enabled 
= _target.Enabled;
            _cur 
= _target.Cursor;

            _target.Enabled 
= false;
            _target.Cursor 
= Cursors.WaitCursor;

        }


        
public void Dispose()
        
{
            
this.Release();
        }


        
private void Release()
        
{
            
if!(_target == null) )
            
{
                _target.Enabled 
= _enabled;
                _target.Cursor 
= _cur;
            }

        }

    }

}


使用方法:

        private void button1_Click(object sender, System.EventArgs e)
        
{
            
using(Change.UI.WaitCursor wc = new Change.UI.WaitCursor(this))
            
{
                DateTime dt;
                dt 
= DateTime.Now;
                
while(true)
                
{
                    System.TimeSpan diff 
= DateTime.Now.Subtract(dt);
                    
if ( diff.Seconds > 3 )
                        
return;
                }

            }

        }


注: 至于为什么不用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中应该是一样的。作为解决办法一直以来我都是这样做的。

if ( XXXX == System.String.Empty )
{
    XXXX.Focus();
    
return;
}

using ( Change.UI.WaitCursor wc = new Change.UI.WaitCursor(this) )
{
    
}

posted @ 2004-09-11 16:56  OSSSME  阅读(2798)  评论(5编辑  收藏  举报