CWaitCursor 类

在单行中显示等待光标,在你执行较长操作时,此光标通常显示为一个沙漏。

语法

class CWaitCursor

成员

公共构造函数

名称 描述
CWaitCursor::CWaitCursor 构造 CWaitCursor 对象并显示等待游标。

公共方法

名称 描述
CWaitCursor::Restore 在等待游标更改后还原等待游标。

备注

CWaitCursor 没有基类。

良好的 Windows 编程做法要求每当执行需要大量时间的操作时显示等待游标。

若要显示等待游标,只需在执行长时间操作的代码之前定义变量 CWaitCursor。 对象的构造函数会自动显示等待游标。

当对象超出范围(在声明 CWaitCursor 对象的块的末尾)时,其析构函数会将游标设置为上一个游标。 换句话说,该对象会自动执行必要的清理。

注意

由于 CWaitCursor 对象的构造函数和析构函数的工作原理,此类对象始终声明为局部变量,它们绝不会声明为全局变量,也不会通过 new 进行分配。

如果执行可能导致游标更改的操作,例如显示消息框或对话框,请调用 Restore 成员函数来还原等待游标。 即使当前已显示等待游标,也可以调用 Restore

显示等待游标的另一种方法是组合使用 CCmdTarget::BeginWaitCursorCCmdTarget::EndWaitCursorCCmdTarget::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++