代码改变世界

[GUI开发]界面繁忙的处理

2013-04-16 22:11  鉴于  阅读(407)  评论(0)    收藏  举报

当主线程需要进行耗时操作时,我们需要告知用户程序正在运行,需要用户耐心等待。这时可在按钮相应事件里添加
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  则将光标设置为等待状态,反之则恢复光标状态

因此,在合适的位置定义一个该类的对象,提示用户系统繁忙,能明显改善用户体验。