我采用定时器绘制一个波形图,定时器函数如下:
void CAaView::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
CRect rect1;
pDC =GetDC();
rect1.bottom = 500;
rect1.top = 0;
rect1.left = 0;
rect1.right = 500;
         CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect1.right,rect1.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt(rect1.left,rect1.top,rect1.right,rect1.bottom,pDC,0,0,SRCCOPY);
DrawWave(&memDC); pDC->BitBlt(rect1.left,rect1.top,rect1.right,rect1.bottom,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject(); CView::OnTimer(nIDEvent);
}
采用这种方式绘图,其中DrawWave(&memDC)为绘图函数,如果直接绘制在单文挡区域的话,每次波形图就会重叠,但是如果绘制在对话框的picture控件里,则显示正常.请高手帮忙看看.

解决方案 »

  1.   

    把绘图的代码放在OnDraw里,在OnTimer里调用Invalidate();
      

  2.   


    在绘制之前你可以调用CDC::FillSolidRect()把显示区域用背景色填充
      

  3.   

    非常谢谢,我已经调出来了,问题出现在
    memDC.BitBlt(rect1.left,rect1.top,rect1.right,rect1.bottom,pDC,0,0,SRCCOPY);
    语句里,不应该采用SRCCOPY,将pDC中的图象又复制了一篇,
    应该用CDC::FillSolidRect()函数.
      

  4.   

    你是多余拷贝了一遍,
    memDC.BitBlt(rect1.left,rect1.top,rect1.right,rect1.bottom,pDC,0,0,SRCCOPY);
    这句应该去掉,换成绘制背景。不过可能会有一个问题,当你的绘图区域被其它窗口遮盖住或者最小化以后,恢复的时候不会自动绘制原来的图形,变成一片灰。当然你绘制的快的话可能看不出来。