我在Cview::onDraw()中用SetTimer();
SetTimer(1,50,NULL);
void CSinView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDC*pDC=GetDC();
static int index=0;
SinBeginPos(index); //自己定义的一个函数
index+=5; Invalidate();
CView::OnTimer(nIDEvent);
}
函数如下:
int CSinView::SinBeginPos(int index)
{
CDC*pDC=GetDC();
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowOrg(0,200);
CPen pen(PS_SOLID,1,RGB(0,0,0));
pDC->SelectObject(&pen);
m_p1=(0,sin(index*3.14/180)*100); for(int i=0;i<10000;i++)
{
m_p2.x=i;m_p2.y=100*sin((index+i)*3.14/180);
pDC->MoveTo(m_p1.x,m_p1.y);
pDC->LineTo(m_p2.x,m_p2.y);
m_p1=m_p2;
}
return 1;
}
问题是:1:画线时闪的厉害
2:画上半周时有条直线在闪,下半轴没有,是不是我画法有问题啊
很少分了,谢谢各位了
SetTimer(1,50,NULL);
void CSinView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDC*pDC=GetDC();
static int index=0;
SinBeginPos(index); //自己定义的一个函数
index+=5; Invalidate();
CView::OnTimer(nIDEvent);
}
函数如下:
int CSinView::SinBeginPos(int index)
{
CDC*pDC=GetDC();
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowOrg(0,200);
CPen pen(PS_SOLID,1,RGB(0,0,0));
pDC->SelectObject(&pen);
m_p1=(0,sin(index*3.14/180)*100); for(int i=0;i<10000;i++)
{
m_p2.x=i;m_p2.y=100*sin((index+i)*3.14/180);
pDC->MoveTo(m_p1.x,m_p1.y);
pDC->LineTo(m_p2.x,m_p2.y);
m_p1=m_p2;
}
return 1;
}
问题是:1:画线时闪的厉害
2:画上半周时有条直线在闪,下半轴没有,是不是我画法有问题啊
很少分了,谢谢各位了
2.OnTimer中的GetDC没有必要,却没有对应的ReleaseDC.
3.SinBeginPos中GetDC也没有对应的ReleaseDC
在GDI 绘图中 如果需要频繁更新界面的,最好使用 内存DC
(关于内存DC 请搜索 函数 CreateCompatibleDC/CreateCompatibleBitmap )如果能够以覆盖模式更新的则 调用 Invalidate(FALSE),此时将不擦除原有图形如果是小范围更新,用 InvalidateRect 可以降低闪烁感
上半周有条直线的问题应该是你设置的static一直增长的原因int CSinView::SinBeginPos(int index, bool bErase)
{
CDC*pDC=GetDC();
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowOrg(0,200);
CPen pen;
if (!bErase)
{
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
pDC->SelectObject(&pen);
}
else
{
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
pDC->SelectObject(&pen);
}
m_p1=(0,sin(index*0.02)*100);
for(int i=0; i<10000; i+=10)
{
m_p2.x=i;m_p2.y=100*sin((index+i)*0.02);
pDC->MoveTo(m_p1.x,m_p1.y);
pDC->LineTo(m_p2.x,m_p2.y);
m_p1=m_p2;
}
ReleaseDC(pDC);
return 1;
}
m_p1=(0,sin(index*0.02)*100);
这是一个逗号表达式,每次只是把sin(index*0.02)*100赋给m_p1.x,而m_p1.y总是0
m_p1=CPoint(0,sin(m_index*3.14/180)*100);