庆祝MFC双缓冲绘图的时候图形出现重叠,如何解决

庆祝MFC双缓冲绘图的时候图形出现重叠,怎么解决?
我用MFC对话框绘制动态移动的实时曲线,能够实现绘图,但是前一帧的图像和后来绘制的图像明显重叠,怎么擦除前一帧绘制的图像?
绘制的数据从串口接收:在OnComm函数中处理
OnComm()
{
......
DrawRTTemHum(rxdata[0],rxdata[1]);
Invalidate(FALSE);
......
}

庆祝MFC双缓冲绘图的时候图形出现重叠,如何解决
我是在对话框中加入了一个图片控件(IDC_PICTURE),然后在在该图片中绘图的,需要绘制实时的温湿度曲线,上面的代码中只绘制了温度曲线。

在onpaint函数中的代码:
庆祝MFC双缓冲绘图的时候图形出现重叠,如何解决
这是运行结果:
庆祝MFC双缓冲绘图的时候图形出现重叠,如何解决

运行结果除了重叠外其他的地方还比较理想,我尝试着在各个地方加入InvalidateRect函数,但是还是重叠,求指点,谢谢
重叠 MFC 绘图

------解决方案--------------------
我也遇到过这个问题,我是在OnEraseBkgnd中画的图,就不会有前面画的图,不知道OnPaint里为什么不能清除以前的,你试试吧
------解决方案--------------------
如果是双缓冲技术,就得在刷新的地方见原来的Buffer清空后再上屏。每次开始绘制时将memdc清空试试,可以用fillrect填充黑色。
------解决方案--------------------
[/code]  3、如何实现双缓冲   
  首先给出实现的程序,然后再解释,同样是在OnDraw(CDC   *pDC)中:
    

  CRect   rc;   // 定义一个矩形区域变量
  GetClientRect(rc);
  int nWidth   =   rc.Width();  
  int nHeight   =   rc.Height();   
      
  CDC   *pDC = GetDC();   // 定义设备上下文
  CDC   MemDC;   // 定义一个内存显示设备对象  
  CBitmap   MemBitmap; // 定义一个位图对象   


   //建立与屏幕显示兼容的内存显示设备     
  MemDC.CreateCompatibleDC(pDC);       
   //建立一个与屏幕显示兼容的位图,位图的大小可选用窗口客户区的大小 
  MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);   
  //将位图选入到内存显示设备中,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上    
  CBitmap   *pOldBit = MemDC.SelectObject(&MemBitmap);       
  //先用背景色将位图清除干净,否则是黑色。这里用的是白色作为背景   
  MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));  
   
  //绘图操作等在这里实现  
  MemDC.MoveTo(……);  
  MemDC.LineTo(……);   
  MemDC.Ellipse(……);  
    
  //将内存中的图拷贝到屏幕上进行显示  
  pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);  
   
  //绘图完成后的清理   
  MemDC.SelectObject(pOldbitmap);    
  MemBitmap.DeleteObject();
   

  上面的注释应该很详尽了,废话就不多说了。   

OnEraseBkgnd里面则什么事都不要做.
------解决方案--------------------
我觉的你不应该在串口接收中绘图,你应该把数据记录下来,然后再接收到新数据后Invalidate刷新下,所有绘图工作都在OnPaint里面实现,而不是弄个全局的memdc记录
------解决方案--------------------
引用:
引用:我也遇到过这个问题,我是在OnEraseBkgnd中画的图,就不会有前面画的图,不知道OnPaint里为什么不能清除以前的,你试试吧

能说说具体怎么实现吗?试了一下不行啊,每次串口数据来的时候,DrawRTTemHum函数就在内存DC上作画,然后系统发送WM_PAINT消息,似乎必须在OnPaint函数中把内存DC中的位图复制到……

可能是因为你Invalidate(FALSE)的原因改为(TRUE)可能响应OnEraseBkgnd吧,而且我用的pDC是OnEraseBkgnd里面自己的,跟你这个还是不一样的,那里面没有用双缓存。
------解决方案--------------------