?? 在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
)?)
{
????
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元


????