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

系统 1646 0

   在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 ) )
{
    
}

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论