VC中的双缓冲画图

今天学习了VC中双缓冲画图,我个人理解双缓冲画图解决的问题有

1、当需要画的图比较大或者复杂的时候,在视图上直接画可能较慢,出现卡的现象

2、当在重绘的时候,视图会有我们所不期望的闪动

为了解决该问题,所以有了双缓冲画图;

因为我们在内存中画图要比在视图上画图快很多,因此我们会先把要画的图在内存中画好,然后调用bitblt把内存中的图画到当前视图

实现双缓冲画图的步骤自己归纳为一下几个步骤:

1、在内存中创建与画布一致的缓冲区,即创建DC(建立一个CDC的对象),但是既然要在内存DC上画图我们就需要载体,因此我们定义一个CBitmap的对象来充当在内存DC上的画布,用SelectObject使CBitmap成为载体;

当然在我们定义好这两个对象后,要对他们做一定的初始化,即创建兼容DC(兼容后才可以使用),调用CreateCompatibleDC;

2、对DC初始化后,我们开始在内存上画图,画图我总结为三步:1、画背景(FillSolidRect),即填充背景。2、画图,如果是贴图这时我们应该创建一个图像列表CImageList,把列表中的图通过DC的Draw函数画到视图中。3、就是进行重绘(这里的重绘是防止你在当前视图上再画动态图片,因此要重绘),如果你只画一张图片,就没有必要了。

 

3、现在我们画图完成,最后通过窗口DC调用Bitblt函数把内存DC上的图直接贴到视图上。

至此 双缓冲完毕。

总结:

(1)在向加载的图片上再次添加图片,例如我们拖放台球案上的小球时,我们要加载的小台球图片有背景怎么办?

在这里我添加代码说明:

 m_ballimage.Create(16,16,ILC_COLOR24|ILC_MASK,2,1);  //此处加上ILC_MASK(表示用到掩码),在Add处加上掩码颜色,即可去除背景颜色
 bitmap1.LoadBitmap(IDB_BITMAP_BALL);
 m_ballimage.Add(&bitmap1,RGB(255,0,255));

(2)当我们要放大或者缩小窗口时,我们要进行重绘,再次初始化DC(创建兼容DC这一步),这是要注意了,我们使用OnSize这个系统函数,在调用初始化DC得时候,我们要对DC是否为空进行判断,否则会出现内存泄露的错误,我在这个地方就犯了错误。

 

最后就是要注意基本常识,指针定义了就要delete,对象我们调用了就要调用销毁函数。

还有定时器的设置和KILL的问题也要注意了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值