我在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:画上半周时有条直线在闪,下半轴没有,是不是我画法有问题啊
很少分了,谢谢各位了

解决方案 »

  1.   

    1.OnDraw中调用SetTimer不合适
    2.OnTimer中的GetDC没有必要,却没有对应的ReleaseDC.
    3.SinBeginPos中GetDC也没有对应的ReleaseDC
      

  2.   


    在GDI 绘图中 如果需要频繁更新界面的,最好使用 内存DC
    (关于内存DC 请搜索 函数 CreateCompatibleDC/CreateCompatibleBitmap )如果能够以覆盖模式更新的则 调用 Invalidate(FALSE),此时将不擦除原有图形如果是小范围更新,用 InvalidateRect 可以降低闪烁感
      

  3.   

    1.OnDraw中调用SetTimer不合适=> SetTimer 放在 View类的 OnInitialUpdate 函数或者菜单命令响应函数里
      

  4.   

    楼上说的是编程的基本问题没有注意,闪的厉害是因为你画的线太多,且重绘的太多。
    上半周有条直线的问题应该是你设置的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; 
    }
      

  5.   

    在内存dc上画出图形,只用一次,然后用不同的x偏移bitblt到显示dc上就行了。
      

  6.   

    楼上的说的可行 先在内存DC中画一个源图 在OnTimer中改变x的偏移量 然后根据x的便宜量重新biblt 注意bitblt前先擦除之前的图
      

  7.   

    上半周有条直线的原因在这:
    m_p1=(0,sin(index*0.02)*100); 
    这是一个逗号表达式,每次只是把sin(index*0.02)*100赋给m_p1.x,而m_p1.y总是0
      

  8.   

    正确的做法是:
    m_p1=CPoint(0,sin(m_index*3.14/180)*100);