MFC解决窗口快速刷新闪烁的问题

语言: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值