最近做了一个自绘的视图,觉得效果还不错。特来与大家分享。
双缓冲技术现在已经充斥整个自绘界,熟练的人,随手拿来就可以用。这里我介绍一些需要注意的地方吧。
应用场合:实时需要更新数据界面的场合。
想象着自己在绘画,要更换画笔,要调颜色,然后在画板上进行绘画,绘画的时候,往往不是一笔、两笔一幅画就绘制完了,有时候先要绘制整个框架,然后再完成细节。如果我们不是在表达艺术效果,往往用户需要实时的查看我们的整体效果。这时候,如果直接在画板上绘制,那用户肯定感觉,这是在放幻灯片吧。
为了让用户察觉不出来我们的绘制过程,用户每一时刻查看的,即是他们想要的结果图的话。我们就需要使用双缓冲技术了。
双缓冲的技术核心就是,首先自己拿一块画板,铺上一块画布,然后在画布上绘图,等一副图绘好了,把这块画板上的图,复制到给用户展示的画板上。复制的过程非常快,这样用户就感觉不到绘图过程了,每次看到的都是实际的数据结果。
来看看真正的绘图操作又是如何完成的。
首先,创建一个自己的画板。
在程序中,画板相当于一个设备上下文DC对象。
CDC memDC; // 我们创建自己的内存DC
memDC.CreateCompatibleDC(&dc);// 创建一个与目标画板相兼容的画板。我们要把自己画板上的东西复制到目标画板,那我们自己创建的画板一定要和目标画板一致
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,cx,cy);
CBitmap *pOldBmp = memDC.SelectObject(&bitmap); // 为我们自己的画板放置一块画布。有了画布我们就可以随便的涂鸦了!
memDC.FillSolidRect(x,y,cx,cy,RGB(255,255,255));// 最好先给画布上填充一种颜色,这里绘制的是一幅白色画布
memDC.SetTextColor(RGB(255,0,0));// 选取文笔颜色
memDC.SelectObject(&m_DigitFont);// 选择书写文本的字体,这里需要注意,字体一定要设置为成员变量,不然临时变量离开了作用域将不起作用
dc.BitBlt(x,y,cx,cy,&memDC,0,0,SRCCOPY);// 将自己的画板内容复制到目标画板
memDC.SelectObject(pOldFont);
memDC.SelectObject(pOldBmp);// 选回之前选择的一些资源
bitmap.DeleteObject();// 删除自己的画布
memDC.DeleteDC();// 删除自己的画板
这里存在两个问题:1.什么时候可以执行我们上面的双缓冲操作,系统为我们提供了Invalidate(TRUE)的,方法,它会导致窗口重绘,也就是会自动调用OnPaint函数,当然如果只需要刷新部分窗口的话,可以使用InvalidateRect();
2.视图刷新背景的时候,界面在背景和视图之间切换时还是会有些闪烁的情况出现。这时候,就需要实现界面代码的OnEraseBkgnd,该函数直接返回TRUE,这样就不让系统来刷新背景,因为这时候整个视图都是我们自己在更新,不需要系统来为我们刷新界面的操作了。
大概我了解的内容就这么多了,希望对你有所帮助。