闪
来源:互联网 发布: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函数将内存中的位图贴到屏幕上。
这样双缓存就实现了。
在屏幕上绘制图形时经常出现桌面闪烁的情况,在图形较多的时候更是如此。这是因为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函数将内存中的位图贴到屏幕上。
这样双缓存就实现了。
- 闪
- 闪退
- 闪回技术(2):闪回归档
- 闪回监控 闪回日志大小
- 小小闪客
- 闪联简介
- 闪屏窗口
- 中国闪媒 杀毒软件
- 闪客帝国
- oracle 闪回功能
- 星星为什么会闪?
- 闪联晋级
- 闪联晋级
- Oracle 数据闪回
- oracle闪回技术
- 闪回数据库
- 闪字效果代码
- 漂亮的闪字
- [搞笑] 后舍男生最完美的视频收藏全纪录
- ant详解
- 给电影人的情书
- STL Deque 总结
- 《I will miss you》我会想你
- 闪
- Ken Orr 对 Java 程序员的建议 (写出高质量软件的秘密)
- 【摘】谈谈我对攻读计算机研究生的看法(zt)
- 致:等待
- [Delphi]如何通过进程句柄判断该进程是否已退出?
- VC常用API
- 用VC获取正在运行的QQ号码
- 列出系统当前进程
- 关于驱动程序中的ioctl