程序目的:鼠标左键按下时画一个圆,1秒后程序自动擦除这个圆。最简单的办法:
void CTTTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
ShowEllipse(point);
::Sleep(1000);
ClearEllipse(point);
}
但是有一个很大的问题:必须等到刚画的圆擦出后,才能画下一个圆。Sleep会让主线程挂起1秒,进入阻塞状态,这段时间连基本的打开菜单、关闭、最小化都不能操作。我想开启一个线程也许能解决问题,但新的问题又来了:在哪里CreateThread ? 怎么释放掉这个资源 ?我希望在窗口上只要鼠标左键按下,就能立即画一个圆,我点了很多下,画了很多圆,然后这些圆一个接一个的消失。
静静等待(貌似有点难度)
void CTTTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
ShowEllipse(point);
::Sleep(1000);
ClearEllipse(point);
}
但是有一个很大的问题:必须等到刚画的圆擦出后,才能画下一个圆。Sleep会让主线程挂起1秒,进入阻塞状态,这段时间连基本的打开菜单、关闭、最小化都不能操作。我想开启一个线程也许能解决问题,但新的问题又来了:在哪里CreateThread ? 怎么释放掉这个资源 ?我希望在窗口上只要鼠标左键按下,就能立即画一个圆,我点了很多下,画了很多圆,然后这些圆一个接一个的消失。
静静等待(貌似有点难度)
类里面维护一个定时器个数 以及一个CPoint数组
每次单击的时候画圆 然后设置定时器ShowEllipse(point);
SetTimer(m_iTimer);
m_vecPoint.pushback(point);OnTimer(int iIDTimer)
{
KillTimer(iIDTimer);
ClearEllipse(m_vecPoint[iIDTimer]);
}
如果担心画和擦除相互影响,最简单的方法可以设定一组定时器,每点击一次nIDTimer++,
当nIDTimer>=N的时候再置零就可以了,我想你1秒怎么快也点击不超过10次吧
#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.谢谢大家的帮助。顶兔子帮。