程序目的:鼠标左键按下时画一个圆,1秒后程序自动擦除这个圆。最简单的办法:
void CTTTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
ShowEllipse(point);
::Sleep(1000);
ClearEllipse(point);

}
但是有一个很大的问题:必须等到刚画的圆擦出后,才能画下一个圆。Sleep会让主线程挂起1秒,进入阻塞状态,这段时间连基本的打开菜单、关闭、最小化都不能操作。我想开启一个线程也许能解决问题,但新的问题又来了:在哪里CreateThread ? 怎么释放掉这个资源 ?我希望在窗口上只要鼠标左键按下,就能立即画一个圆,我点了很多下,画了很多圆,然后这些圆一个接一个的消失。
静静等待(貌似有点难度)

解决方案 »

  1.   

    SetTimer就行了啊? 
    类里面维护一个定时器个数 以及一个CPoint数组
    每次单击的时候画圆 然后设置定时器ShowEllipse(point);
    SetTimer(m_iTimer);
    m_vecPoint.pushback(point);OnTimer(int iIDTimer)
    {
        KillTimer(iIDTimer);
        ClearEllipse(m_vecPoint[iIDTimer]);
    }
      

  2.   

    ? 画一个圆就安一个定时器,同时记录下 point ,时间到就销毁定时器,擦除圆?呵呵,有办法。带我好好看看怎么维护他们。
      

  3.   

    用SetTimer设定定时器就可以了,当单击鼠标的时候开始启动定时器,1s后擦除圆
    如果担心画和擦除相互影响,最简单的方法可以设定一组定时器,每点击一次nIDTimer++,
    当nIDTimer>=N的时候再置零就可以了,我想你1秒怎么快也点击不超过10次吧
      

  4.   

    呵呵,确实挺好用的。我发现这可以用一个队列来维护,正符合队列的特点。
    #include <queue>
    using namespace std;typedef struct _TimerPoint
    {
    int nID;
    CPoint point;
    }TimerPoint;class CTTTTTTTTOOOOOOODlg : public CDialog
    {
    protected: static int index;
    queue<TimerPoint> Timer_Point;
            ......
    };void CTTTTTTTTOOOOOOODlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    ShowEllipse(point); index++;
    int nID=index;
    TimerPoint tp;
    tp.nID=index;
    tp.point=point;
    Timer_Point.push(tp); ::SetTimer(m_hWnd,nID,3*1000,NULL);
    }void CTTTTTTTTOOOOOOODlg::OnTimer(UINT nIDEvent)
    {
    TimerPoint tp;
    tp=Timer_Point.front();
    Timer_Point.pop();
    ::KillTimer(m_hWnd,tp.nID);
    ClearEllipse(tp.point);}
    呵呵,完全用不着vector。效果还挺好的。index++ 完全是为了每次产生不同的 nIDEvent.谢谢大家的帮助。顶兔子帮。