语言: VC++, IDE: VS2017
问题描述:
在窗口上快速刷新图片,并叠加矩形框或者位图等较多内容,此时叠加内容会出现闪烁,
查了下,显卡会按照刷新周期定时将显存中的内容输出到屏幕,如果一个完整的刷新动作(包括刷新图片和叠加的其他内容,会多次往显存中写数据)不能在一个周期内完成,会出现闪烁的现象,所以可以通过增加内存缓冲,并在所有数据全部准备好后,一次性写到显存中,来解决该问题,
以下不是完整的代码,只提供一个参考解决思路,可以加在OnPaint中,按照个人理解增加了注释,
CDC* pDC = GetDC(); // 获取窗口DC
CDC MemDC; // 一个兼容DC,可以理解为上面所说的内存缓冲角色
CBitmap MemBitmap; // 用来获取窗口DC的“画布”
CRect rect;
GetClientRect(&rect); // 获取当前窗口大小
MemDC.CreateCompatibleDC(pDC); // 创建兼容DC
MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); // 以窗口DC创建“画布”
MemDC.SelectObject(&MemBitmap); // 将“画布”和作为“缓冲”的兼容DC关联
// 此处代码省略,根据需要添加
// 将之前的绘图动作(刷新图片,叠加位图等)在这个兼容DC上做,而不是在窗口DC上
// 窗口DC调用BitBlt,将兼容DC上已经绘制好的内容一次性输出到屏幕(写到显存)
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
MemBitmap.Detach();
MemDC.DeleteDC();
ReleaseDC(pDC);
以上内容参考:
https://www.cnblogs.com/afarmer/archive/2011/05/06/2038896.html
https://blog.csdn.net/helinlin007/article/details/7781279