MFC|双缓存绘图机制
最近在用 MFC 框架做开发,突然间想到了绘制图形刷新不及时的问题,就想来跟大家分享一下。说心里话,使用 MFC 绘图真的好麻烦呀,尤其是绘制心电图、波形图时,如果只是用普通的绘制就会导致上次的图形未被清除,这次的新图形又画上去了,多次重叠。内容绘制不正确而且看起来很是难看。
有些时候我们在使用 OnPaint 绘制图形或者是控件重绘时,会发现控件上的贴图会闪烁。这是因为在短时间内频发出现背景色与显示的图片交替出现的情况,那么我们该如何避免这种情况发生呢?
只要去掉 MFC 提供的背景绘制过程或者是重载 OnEraseBkgnd。
那么,在绘图时,我们该如何进行操作呢?
接下来,我们就以控件的自绘来说明,有些控件的自绘是需要双缓存机制的,例如:CHeaderCtrl 控件,这是 CListCtrl 的表头类,这里不详细说明该类是如何绘制的,仅仅说明该类用到了双缓存机制。
CXXDlg::OnPaint 中实现双缓存机制
第一步:获取显示的客户端区域大小
复制代码
第二步:定义位图对象
复制代码
在后续的绘制中,都会将所有的图形绘制在 CDC 上面
第三步:设置 Bitmap 画刷填充整个区域
复制代码
设置当前双缓存的默认背景色
第四步:创建与指定设备兼容的内容设备上下文环境
复制代码
设备上下文环境呗创建后,显示的界面仅仅是一个标准的一个单色像素宽和高
并且,在绘制图形之前一定要通过 CDC::CreateCompatibleDC 指定环境。
第五步:创建扩展内存设备环境图像空间
说的有点高深,大家就记住了,有第四步的时候一定要有第五步,它们两个是并列出现的。
复制代码
第六步:将位图信息绑定到 CDC 上
复制代码
在这里,我们需要注意的是,我用了一个 pOldMemBmp 来存储绑定的返回值,主要是为了在绘图结束之后可以释放绑定的 bitmap,否则绘图过多就是导致内存泄漏。
第七步:自定义绘制
到这里,就可以实现绘制功能了,比如绘制图片,绘制文本等等。。。
第八步:BitBlt 图形
这也是最重要的一步,将绘制好的内容映射到目标设备上,如果缺少这一步骤,绘制的图形将不会显示出来的。
复制代码
第九步:释放在绘制图形中用到的资源
复制代码
评论