读书人

MFC定时器初学者一问

发布时间: 2013-06-26 14:29:32 作者: rapoo

MFC定时器菜鸟一问

如图所示,绕一定点每隔5度画一个圆。
MFC定时器初学者一问
我想弄一个定时器(不是Sleep 函数,让它每0.1S自动画一次。请问SetTimer()放哪,在OnTimer添加什么响应函数?OnDraw?

void CMy912104220335View::OnDraw(CDC* pDC)
{
CMy912104220335Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
D=0;//角度
R1=100;//R1为旋转半径
R2=100;//R2为圆半径
CRect Rect;
GetClientRect(&Rect);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=pDC->SelectObject(pBrush);
int centerx=Rect.right/2;
int centery=Rect.bottom/2;
int x,y;
for(int i=0;i<=71;i++)
{
D=5*i*3.1415926/180;
x=int(centerx+R1*cos(D));
y=int(centery-R1*sin(D));
pDC->Ellipse(int(x-1.414*R2),int(y-1.414*R2),int(x+1.414*R2),int(y+1.414*R2));//以上为画圆函数
Sleep(100);
}
//SetTimer(1,100,NULL);//定时器



void CMy912104220335View::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default

CView::OnTimer(nIDEvent);
}

[解决办法]
将SetTimer()放在View类的OnInitialUpdate()函数中:SetTimer(1,100,0);

既然想保留上次绘制的图形,就不要把绘制代码放到OnDraw函数中,可以放到一个自定义函数DrawImage中
在View类中定义一个成员变量int i=0;
在OnTimer函数中直接调用DrawImage函数,如:
3456 void CMy912104220335View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
DrawImage();
i++;
CView::OnTimer(nIDEvent);
}


但需要把DrawImage原来代码中这段代码改一下:
if(i<=71)//原来是:for(int i=0;i<=71;i++)
{
D=5*i*3.1415926/180;
x=int(centerx+R1*cos(D));
y=int(centery-R1*sin(D));
pDC->Ellipse(int(x-1.414*R2),int(y-1.414*R2),int(x+1.414*R2),int(y+1.414*R2));
}
else
{
KillTimer(1);
}

读书人网 >VC/MFC

热点推荐