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

来源:互联网 发布:淘宝一折特卖 - 百度 编辑:程序博客网 时间:2024/05/01 04:25

 

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

(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));

原创粉丝点击