双缓冲解决绘制图象闪烁问题

来源:互联网 发布:烟袋斜街10号 网络剧 编辑:程序博客网 时间:2024/04/30 17:04

C++ Builder中的实现方法:

原理:双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,
再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。

双缓冲实现过程如下:

1、在内存中创建与画布一致的缓冲区 

BufferBmp=new Graphics::TBitmap();  //创建位图
BufferBmp->Canvas->Handle=CreateCompatibleDC(Canvas->Handle); //创建一个兼容DC
BufferBmp->Width=Width;  //设置位图宽度
BufferBmp->Height=Height; //设置位图高度

2、在缓冲区画图

BufferBmp->Canvas->Brush->Color=clBtnFace; //设置画刷颜色
BufferBmp->Canvas->FillRect(Rect(0,0,Width,Height));//清空背景
BufferBmp->Canvas->MoveTo(…,....);
//以下添加你的画图操作

3、将缓冲区位图拷贝到当前画布上
BitBlt(Canvas->Handle,0,0,Width,Height,BufferBmp->Canvas->Handle,0,0,SRCCOPY);

4、释放内存缓冲区
delete BufferBmp;

VC中的实现双缓冲方法:

双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。
双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。

//在OnDraw(CDC *pDC)中:

CDC MemDC; 
//首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);

//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();

补充:另外若在Delphi中要将画布的DoubleBuffer属性设为True,启用双缓冲;

 

原创粉丝点击