双缓冲绘图

最近做了一个自绘的视图,觉得效果还不错。特来与大家分享。

双缓冲技术现在已经充斥整个自绘界,熟练的人,随手拿来就可以用。这里我介绍一些需要注意的地方吧。

应用场合:实时需要更新数据界面的场合。

想象着自己在绘画,要更换画笔,要调颜色,然后在画板上进行绘画,绘画的时候,往往不是一笔、两笔一幅画就绘制完了,有时候先要绘制整个框架,然后再完成细节。如果我们不是在表达艺术效果,往往用户需要实时的查看我们的整体效果。这时候,如果直接在画板上绘制,那用户肯定感觉,这是在放幻灯片吧。


为了让用户察觉不出来我们的绘制过程,用户每一时刻查看的,即是他们想要的结果图的话。我们就需要使用双缓冲技术了。

双缓冲的技术核心就是,首先自己拿一块画板,铺上一块画布,然后在画布上绘图,等一副图绘好了,把这块画板上的图,复制到给用户展示的画板上。复制的过程非常快,这样用户就感觉不到绘图过程了,每次看到的都是实际的数据结果。

来看看真正的绘图操作又是如何完成的。

首先,创建一个自己的画板。

在程序中,画板相当于一个设备上下文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,这样就不让系统来刷新背景,因为这时候整个视图都是我们自己在更新,不需要系统来为我们刷新界面的操作了。


大概我了解的内容就这么多了,希望对你有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值