GDI双缓冲实现与GDI+双缓冲实现

本文详细介绍双缓冲技术原理及其实现步骤。通过实例演示如何利用双缓冲解决闪烁问题,提高绘图质量。涵盖创建虚拟画布、绘图及将图像复制到屏幕等关键步骤。

我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

  如何实现双缓冲
  首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:
  CDC MemDC; //首先定义一个显示设备对象
  CBitmap MemBitmap;//定义一个位图对象
  //随后建立与屏幕显示兼容的内存显示设备
  MemDC.CreateCompatibleDC(NULL);
  //这时还不能绘图,因为没有地方画 ^_^
  //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
  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();

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

GDI+实现双缓冲的具体步骤

我再来详细解释一下刚才实现双缓冲的具体步骤:

1、在内存中建立一块“虚拟画布”:

Bitmap bmp = new Bitmap(600, 600);

2、获取这块内存画布的Graphics引用:

Graphics g = Graphics.FromImage(bmp);

3、在这块内存画布上绘图:

g.FillEllipse(brush, i * 10, j * 10, 10, 10);

4、将内存画布画到窗口中

this.CreateGraphics().DrawImage(bmp, 0, 0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值