来源:互联网 发布:apache windows下载 编辑:程序博客网 时间:2024/04/30 03:55
你用双缓存就可以解决闪烁而又不花屏了.
在屏幕上绘制图形时经常出现桌面闪烁的情况,在图形较多的时候更是如此。这是因为Windows程序在重绘窗口以前总是要先用当前系统的背景色将窗口刷干净。然后再调用视图类的OnPaint函数,用OnDraw函数将窗口内的所有图形重绘一遍。闪烁现象是因为屏幕上的图像前后反差太大而造成的。要消除闪烁现象首先就要禁止程序用背景色刷屏。要达到这一目的,只要使视图类的OnEraseBkgnd函数的返回值为TRUE就行了。可是这样一来屏幕很快就会乱掉,除非在OnDraw函数中用背景色将窗口内以前的东西刷干净。但如果这样做的话就和没有设置OnEraseBkgnd函数的效果一样了。不过这样做了以后刷除背景的权利就掌握在了自己手中。
前面已经讨论过了闪烁现象出现的原因,如果能使屏幕上前后的图像相差很小就不会有闪烁现象了。其实每次要在屏幕上绘制的整个图像与前面的图像相差都很小。但是由于绘图过程有时间延迟,使得整个图像被分成一个个反差很大图像。如果将所有异步输出的图像同步显示出来,那么问题就解决了。这也正是屏幕双缓存的工作原理。
所谓双缓存,是指屏幕缓存和内存缓存。屏幕缓存中存有前面绘制的图像,内存缓存中存有当前要绘制的图像。屏幕重绘时只显示内存缓存中的东西,这样一来消除闪烁现象的条件就满足了。
两个缓存中只有内存缓存是需要自己创建的。在程序里它被建在了OnDraw函数中:
CBitmap   bitmap;
bitmap.CreateCompatibleBitmap   (pDC,nBmpWidth,nBmpHight);
CDC   dcMem;
dcMem.CreateCompatibleDC   (pDC);
CBitmap*   pOldBitmap   =   dcMem.SelectObject   (&bitmap);

用dcMem画图

pDC->BitBlt   (0,   0,(int)(pDoc->m_WEworkEnviroment.GetActualDeskWidth()*fProportion),   (int)(pDoc->m_WEworkEnviroment.GetActualDeskHight()*fProportion),   &dcMem,   0,   0,SRCCOPY);
这里使用一张DDB位图作为内存缓存。
首先用CBitmap类的CreateCompatibleBitmap函数创建位图,然后用CDC类的CreateCompatibleDC函数创建一张内存设备描述表,并将位图选入其中,完成位图与内存的绑定。这以后图形都被画在内存设备描述表中。最后用屏幕设备描述表调用BitBlt函数将内存中的位图贴到屏幕上。
这样双缓存就实现了。
原创粉丝点击