打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用内存设备环境(Memory Device Context)与GetClipBox函数(获得需要重绘的区域)实现无闪烁的高效绘图

// Get the invalidate rectangle  

CRect clipRect;  

pDC->GetClipBox(clipRect);  

  

// Create memory device context  

CDC memDc;  

memDc.CreateCompatibleDC(pDC);  

CBitmap memBitmap;  

memBitmap.CreateCompatibleBitmap(pDC, clipRect.Width(), clipRect.Height());  

  

// Erase the background  

memDc.FillSolidRect(0, 0, clipRect.Width(), clipRect.Height(), RGB(211, 211, 211));  

  

pDC->BitBlt(clipRect.left, clipRect.top, clipRect.Width(), clipRect.Height(), &memDc, 0, 0, SRCCOPY);  

  

memDc.DeleteDC();  

memBitmap.DeleteObject();  

 

下面对以上代码进行说明:

(1)获得需要绘图的矩形(Rectangle)

    通常使用GetClientRect()函数获得整个区域。但是,通常情况下并不是整个区域都要绘制,比如:你用另一个窗口遮住了需要绘制的窗口的一部分,当你移动遮挡窗口时,只需要绘制露出的那部分就行了,犯不着把整个窗口都绘制一遍,这样效率很低下。我们用CDC::GetClipBox函数获得需要绘制的矩形区域(即无效区域)。

(2)实现无闪烁的绘图

    想要消除闪烁,当然首先要知道为什么产生闪烁。那样我们才知道这样避免闪烁。

    闪烁是由背景色与绘图产生强烈反差引起的。也就是说我在绘图前先要擦掉我绘图区域的以前图片,否则将会与以前的图片发生混乱,这可以用在黑板上写字的例子做理解,如果在我写字之前,黑板上有字,那么我在写字的话,你保证下面看的人愿意吗?呵呵。所以,我先擦掉原来的字,再写。OK。在计算机中类似,但是我不是用黑板擦,我是用一种颜色(背景色)涂满我要绘图的区域,然后再绘图。这样,涂色,绘图,涂色,绘图.............,让人的眼睛产生了闪烁的感觉。那我们要是先把图画好,再显示出来,那闪烁的效果就没了。这类似与动画片,大家知道动画片的每一帧都是一个完整的图片,快速播放,是没有闪烁效果的。要是在每帧之间插个白色图片(类似图背景色),就有闪烁效果了。

    所谓内存设备环境,就是我们在内存中建立一个与物理设备兼容的设备环境。再创建一个与设备兼容的位图,内存设备环境在这个位图上绘图,然后再把画好的位图拷贝到物理设备环境。这样就是上面我提到的消除闪烁的方法的实现。

 

// 创建与设备上下环境兼容的设备环境

CDC memDc;
memDc.CreateCompatibleDC(pDC);

 

// 创建一个与设备兼容的位图(宽,高与需要绘图的区域对应)

CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(pDC, clipRect.Width(), clipRect.Height());

 

//

// Erase the background
memDc.FillSolidRect(0, 0, clipRect.Width(), clipRect.Height(), RGB(211, 211, 211));

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VC的内存绘图防止屏幕闪烁技术的实现
CreateCompatibleDC
防止画图时背景的擦除?(传说中的双缓冲)(转载)
MFC双缓冲解决闪烁问题 (zhuanzai)
测井曲线绘图显示算法总结——双缓冲技术
C++截取整个屏幕,并生成图片(基于MFC)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服