Win32双缓冲绘图和位图的绘制

目的:

原因是绘图(前景)与显示器(背景)刷新不同步,有时间差,眼睛看上去好像在闪烁。为解决这一问题,这就需要用到双缓冲技术来绘图了。双缓冲技术是相对单缓冲而言的,单缓冲就是直接在设备DC上绘图;而双缓冲就是先在一个与设备DC相兼容的内存缓冲区里进行绘图,然后再一次性复制到设备DC上。一次性在屏幕上显示就不会出现闪烁的现象。

一、双缓冲技术的使用

双缓冲绘图步骤:
1.在内存中创建兼容DC缓冲区(依次包括创建兼容DCCreateComatibleDC、创建画布CreatrCompatibleBitnap、将画布选入SelectObject)。
2.在缓冲区进行画图操作(可以画图形、也可以贴位图)。
3.将兼容缓冲区一次性复制到设备DC上。(复制用Bitblt函数)
4.释放内存缓冲区。(DeleteDC函数)

几个关键API函数:
CreateCompatibleDC:
该函数创建一个与指定设备兼容的内存设备上下文环境(DC)

HDC CreateCompatibleDC(HDC hdc)

CreateCompatibleBitmap:
该函数创建与指定的设备环境相关的设备兼容的位图

HBITMAP CreateCompatibleBitmap(HDC hdc,  
                               int nWidth,   // 定位图的宽度,单位为像素
                               int nHeight)// 指定位图的高度,单位为像素

BitBlt:
BitBlt是一个计算机函数,该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境

BOOL BitBlt(  _In_  HDC hdcDest, 
              _In_  int nXDest,  // 指定目标矩形区域左上角的X轴逻辑坐标
              _In_  int nYDest,  // 指定目标矩形区域左上角的Y轴逻辑坐标
              _In_  int nWidth,  // 指定源在目标矩形区域的逻辑宽度
              _In_  int nHeight, // 指定源在目标矩形区域的逻辑高度
              _In_  HDC hdcSrc,  // 指向源设备环境的句柄
              _In_  int nXSrc,   // 指定源矩形区域左上角的X轴逻辑坐标
              _In_  int nYSrc,   // 指定源矩形区域左上角的Y轴逻辑坐标
              _In_  DWORD dwRop); //指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。

单双缓冲技术操作对比:

单缓冲技术绘制两个矩形:

// 直接在设备DC上绘制
Rectangle(hdc, 100, 100, 200, 200);
Rectangle(hdc, 300, 300, 200, 200);

双缓冲技术绘制两个矩形:

// 1.创建兼容缓冲区
mdc = CreateCompatibleDC(hdc);   // 创建兼容DC
bmp = CreateCompatibleBitmap(hdc, 600, 600);   // 创建兼容位图画布
SelectObject(mdc, bmp);    // 选入

// 2.在缓冲区绘制 
Rectangle(mdc, 100, 100, 200, 200);
Rectangle(mdc, 300, 300, 200, 200);

// 3.一次性复制到设备DC
BitBlt(hdc, 0, 0, 500, 500, mdc, 0, 0, SRCCOPY);
 
// 4.释放缓冲区DC
DeleteDC(mdc);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值