当主线程需要进行耗时操作时,我们需要告知用户程序正在运行,需要用户耐心等待。这时可在按钮相应事件里添加
CWaitCursor curWait;
该语句将会定义个CWaitCursor对象,在构造函数里会将光标设置为等待状态,在退出该作用域时会调用析构函数将恢复光标状态。
CWaitCursor 定义在afxwin2.inl文件中
_AFXWIN_INLINE CWaitCursor::CWaitCursor()
{ AfxGetApp()->BeginWaitCursor(); }
_AFXWIN_INLINE CWaitCursor::~CWaitCursor()
{
AFX_BEGIN_DESTRUCTOR
AfxGetApp()->EndWaitCursor();
AFX_END_DESTRUCTOR
}
BeginWaitCursor和EndWaitCursor函数最后都调用了函数CWinApp::DoWaitCursor(int nCode)
void CCmdTarget::BeginWaitCursor()
{ AfxGetApp()->DoWaitCursor(1); }
void CCmdTarget::EndWaitCursor()
{ AfxGetApp()->DoWaitCursor(-1); }
void CWinApp::DoWaitCursor(int nCode)
{
// 0 => restore, 1=> begin, -1=> end
ENSURE_ARG(nCode == 0 || nCode == 1 || nCode == -1);
ENSURE(afxData.hcurWait != NULL);
AfxLockGlobals(CRIT_WAITCURSOR);
m_nWaitCursorCount += nCode;
if (m_nWaitCursorCount > 0)
{
HCURSOR hcurPrev = ::SetCursor(afxData.hcurWait);
if (nCode > 0 && m_nWaitCursorCount == 1)
m_hcurWaitCursorRestore = hcurPrev;
}
else
{
// turn everything off
m_nWaitCursorCount = 0; // prevent underflow
::SetCursor(m_hcurWaitCursorRestore);
}
AfxUnlockGlobals(CRIT_WAITCURSOR);
}
在CWinApp中有个等待计数,如果 等待数>0 则将光标设置为等待状态,反之则恢复光标状态
因此,在合适的位置定义一个该类的对象,提示用户系统繁忙,能明显改善用户体验。