[cpp] view plaincopy // 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;
// 创建一个与设备兼容的位图(宽,高与需要绘图的区域对应) CBitmap memBitmap;
// // Erase the background |
|