解决mfc绘图过程中的闪烁

解决mfc绘图过程中的闪烁

ID:18334933

大小:54.50 KB

页数:17页

时间:2018-09-16

解决mfc绘图过程中的闪烁_第1页
解决mfc绘图过程中的闪烁_第2页
解决mfc绘图过程中的闪烁_第3页
解决mfc绘图过程中的闪烁_第4页
解决mfc绘图过程中的闪烁_第5页
资源描述:

《解决mfc绘图过程中的闪烁》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、如何解决绘图过程中的闪烁在VC中进行绘图过程处理时,如果图形刷新很快,经常出现图形闪烁的现象。利用先在内存绘制,然后拷贝到屏幕的办法可以消除屏幕闪烁,具体的方法是先在内存中创建一个与设备兼容的内存设备上下文,也就是开辟一快内存区来作为显示区域,然后在这个内存区进行绘制图形。在绘制完成后利用BitBlt函数把内存的图形直接拷贝到屏幕上即可。具体的代码实现为:(1)创建内存区域CDC*pMem=newCDC;  CBitmap*pBmp=newCBitmap;CBitmap*pOldBmp;CDC*pDC=GetDC();CRectrectTemp;为绘图区域pMem->CreateCo

2、mpatibleDC(pDC);pBmp->CreateCompatibleBitmap(pDC,rectTemp.Width(),rectTemp.Height());pOldBmp=pMem->SelectObject(pBmp);(2)进行图形绘制pMem->LineTo(...); 进行绘图处理(3)拷贝到屏幕                     pDC->BitBlt(rectTemp.left,rectTemp.top,rectTemp.Width(),rectTemp.Height(),pMem,0,0,SRCCOPY);pMem->SelectObject(pOl

3、dBmp);pBmp->DeleteObject();pMem->DeleteDC();================================================================================================双缓存机制解决VC++绘图时的闪烁问题显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。我想就我长期(

4、呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。1、显示的图形为什么会闪烁?我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。有的人会说,闪烁是因为绘图的速度太慢

5、或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在OnDraw(CDC*pDC)中这样写:pDC->MoveTo(0,0);pDC->LineTo(100,100);这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画只会闪烁一次。这个也可以试验

6、,在OnDraw(CDC*pDC)中这样写:for(inti=0;i<100000;i++){pDC->MoveTo(0,i);pDC->LineTo(1000,i);}呵呵,程序有点变态,但是能说明问题。说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,不闪

7、才怪呢。2、如何避免闪烁在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC提供的背景绘制过程了。实现的方法很多,*可以在窗口形成时给窗口的注册类的背景刷付NULL*也可以在形成以后修改背景staticCBrushbrush(RGB(255,0,0));SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);*要简单也可以重载OnEraseBkgnd(CDC*pDC)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。