CWaitCursor 类
在单行中显示等待光标,在你执行较长操作时,此光标通常显示为一个沙漏。
语法
class CWaitCursor
成员
公共构造函数
名称 | 描述 |
---|---|
CWaitCursor::CWaitCursor | 构造 CWaitCursor 对象并显示等待游标。 |
公共方法
名称 | 描述 |
---|---|
CWaitCursor::Restore | 在等待游标更改后还原等待游标。 |
备注
CWaitCursor
没有基类。
良好的 Windows 编程做法要求每当执行需要大量时间的操作时显示等待游标。
若要显示等待游标,只需在执行长时间操作的代码之前定义变量 CWaitCursor
。 对象的构造函数会自动显示等待游标。
当对象超出范围(在声明 CWaitCursor
对象的块的末尾)时,其析构函数会将游标设置为上一个游标。 换句话说,该对象会自动执行必要的清理。
注意
由于 CWaitCursor
对象的构造函数和析构函数的工作原理,此类对象始终声明为局部变量,它们绝不会声明为全局变量,也不会通过 new
进行分配。
如果执行可能导致游标更改的操作,例如显示消息框或对话框,请调用 Restore 成员函数来还原等待游标。 即使当前已显示等待游标,也可以调用 Restore
。
显示等待游标的另一种方法是组合使用 CCmdTarget::BeginWaitCursor、CCmdTarget::EndWaitCursor 和 CCmdTarget::RestoreWaitCursor。 但是,CWaitCursor
使用起来更简单,因为当完成长时间的操作后,不需要将游标设置为上一个游标。
注意
MFC 使用 CWinApp::DoWaitCursor 虚拟函数设置和还原游标。 可以重写此函数以提供自定义行为。
继承层次结构
CWaitCursor
要求
标头:afxwin.h
示例
BOOL SomeLengthyProcess()
{
CWaitCursor wait;
//Do the lengthy processing.
Sleep(1000);
AfxMessageBox(_T("Some result")); //This changes the cursor.
wait.Restore(); //Restore the Wait cursor.
//Continue Processing.
Sleep(1000);
//The destructor changes the cursor back to Regular cursor.
return TRUE;
}
CWaitCursor::CWaitCursor
若要显示等待游标,只需在执行长时间操作的代码之前声明 CWaitCursor
对象。
CWaitCursor();
备注
构造函数会自动显示等待游标。
当对象超出范围(在声明 CWaitCursor
对象的块的末尾)时,其析构函数会将游标设置为上一个游标。 换句话说,该对象会自动执行必要的清理。
由于析构函数在块(该块可能位于函数末尾之前)末尾进行调用,可以利用这一点来使等待游标仅在函数的部分位置处于活跃状态。 下面的第二个示例显示了此方法。
注意
由于 CWaitCursor
对象的构造函数和析构函数的工作原理,此类对象始终声明为局部变量,它们绝不会声明为全局变量,也不会通过 new
进行分配。
示例
// The following example illustrates the most common case
// of displaying the wait cursor during some lengthy
// processing.
void LengthyFunction()
{
// perhaps you display a dialog box before displaying a
// wait cursor
CWaitCursor wait; // display wait cursor
// do some lengthy processing
Sleep(1000);
} // destructor automatically removes the wait cursor
// This example shows using a CWaitCursor object inside a block
// so the wait cursor is displayed only while the program is
// performing a lengthy operation.
void ConditionalFunction()
{
if (SomeCondition)
{
CWaitCursor wait; // display wait cursor in this block only
// do some lengthy processing
Sleep(1000);
} // at this point, the destructor removes the wait cursor
else
{
// no wait cursor--only quick processing
}
}
CWaitCursor::Restore
若要还原等待游标,请在执行操作(例如显示消息框或对话框)后调用此函数,这可能会将等待游标更改为另一个游标。
void Restore();
备注
即使当前已显示等待游标,也可以调用 Restore
。
如果需要在声明 CWaitCursor
对象以外的函数中还原等待游标,可以调用 CCmdTarget::RestoreWaitCursor。
示例
// This example illustrates performing an operation
// which changes the wait cursor. You should call
// CWaitCursor::Restore to restore the wait
// cursor after an operation which changes the cursor.
void AnotherLengthyFunction()
{
CWaitCursor wait; // display wait cursor
// do some lengthy processing
Sleep(1000);
// The dialog box will normally change the cursor to
// the standard arrow cursor.
CFileDialog dlg(TRUE);
dlg.DoModal();
// It is necessary to call Restore here in order
// to change the cursor back to the wait cursor.
wait.Restore();
// do some more lengthy processing
Sleep(1000);
// destructor automatically removes the wait cursor
}
// If the wait cursor is changed by a function called by
// the function which created the wait cursor, you
// can call CCmdTarget::RestoreWaitCursor to restore
// the wait cursor.
void CalledFunction()
{
CFileDialog dlg(TRUE);
dlg.DoModal();
// Since CWinApp is derived from CCmdTarget, we can use a
// pointer to our application object to make the call to
// CCmdTarget::RestoreWaitCursor.
AfxGetApp()->RestoreWaitCursor();
// Yet more lengthy processing...
Sleep(1000);
}
另请参阅
层次结构图
CCmdTarget::BeginWaitCursor
CCmdTarget::EndWaitCursor
CCmdTarget::RestoreWaitCursor
CWinApp::DoWaitCursor
Change the mouse pointer for a window in MFC by using Visual C++