庆祝MFC双缓冲绘图的时候图形出现重叠,如何解决
庆祝MFC双缓冲绘图的时候图形出现重叠,怎么解决?
我用MFC对话框绘制动态移动的实时曲线,能够实现绘图,但是前一帧的图像和后来绘制的图像明显重叠,怎么擦除前一帧绘制的图像?
绘制的数据从串口接收:在OnComm函数中处理
OnComm()
{
......
DrawRTTemHum(rxdata[0],rxdata[1]);
Invalidate(FALSE);
......
}
我是在对话框中加入了一个图片控件(IDC_PICTURE),然后在在该图片中绘图的,需要绘制实时的温湿度曲线,上面的代码中只绘制了温度曲线。
在onpaint函数中的代码:
这是运行结果:
运行结果除了重叠外其他的地方还比较理想,我尝试着在各个地方加入InvalidateRect函数,但是还是重叠,求指点,谢谢
------解决方案--------------------
我也遇到过这个问题,我是在OnEraseBkgnd中画的图,就不会有前面画的图,不知道OnPaint里为什么不能清除以前的,你试试吧
------解决方案--------------------
如果是双缓冲技术,就得在刷新的地方见原来的Buffer清空后再上屏。每次开始绘制时将memdc清空试试,可以用fillrect填充黑色。
------解决方案--------------------
[/code] 3、如何实现双缓冲
首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:
上面的注释应该很详尽了,废话就不多说了。
OnEraseBkgnd里面则什么事都不要做.
------解决方案--------------------
我觉的你不应该在串口接收中绘图,你应该把数据记录下来,然后再接收到新数据后Invalidate刷新下,所有绘图工作都在OnPaint里面实现,而不是弄个全局的memdc记录
------解决方案--------------------
可能是因为你Invalidate(FALSE)的原因改为(TRUE)可能响应OnEraseBkgnd吧,而且我用的pDC是OnEraseBkgnd里面自己的,跟你这个还是不一样的,那里面没有用双缓存。
------解决方案--------------------
我用MFC对话框绘制动态移动的实时曲线,能够实现绘图,但是前一帧的图像和后来绘制的图像明显重叠,怎么擦除前一帧绘制的图像?
绘制的数据从串口接收:在OnComm函数中处理
OnComm()
{
......
DrawRTTemHum(rxdata[0],rxdata[1]);
Invalidate(FALSE);
......
}
我是在对话框中加入了一个图片控件(IDC_PICTURE),然后在在该图片中绘图的,需要绘制实时的温湿度曲线,上面的代码中只绘制了温度曲线。
在onpaint函数中的代码:
这是运行结果:
运行结果除了重叠外其他的地方还比较理想,我尝试着在各个地方加入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记录
------解决方案--------------------
可能是因为你Invalidate(FALSE)的原因改为(TRUE)可能响应OnEraseBkgnd吧,而且我用的pDC是OnEraseBkgnd里面自己的,跟你这个还是不一样的,那里面没有用双缓存。
------解决方案--------------------