今天学习了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的问题也要注意了。