我的鸡肋条之一: 仿CWaitCursor的应用
在MFC中有这样一个类CWaitCursor。功能虽小,但是做UI的时候却是从来不会少用的。以至于用VC的时候会用自制的继承于CWaitCursor的CXXXWaitCursorEx类,用VB的时候,会自己做一个CWaitCursor,。。。。。。
# 有关CWaitCursor的定义以及它本身的意义,如果您不清楚请参阅相关文档或者Google一下。
# 应该很快就可以找到。
到了.NET的时代,因为析构函数没有办法按照程序员的意愿在指定的时间发生,我似乎没有想的就在很早前否定了这个功能。其实在很早的时候也已经知道了Using这个东西,可惜事情没有经过大脑,只是想当然的,外加工作中也不用.NET,失之交臂。
终于让我有机会在今天想起来这件事情,简单的做了一小段代码。
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;
}
}
}
}
使用方法:
{
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中应该是一样的。作为解决办法一直以来我都是这样做的。
{
XXXX.Focus();
return;
}
using ( Change.UI.WaitCursor wc = new Change.UI.WaitCursor(this) )
{
}