关于win32双缓存绘制

画个 小图 

所谓双缓存绘制 作用便是 在添加定时器之后 绘制图片 不会照成闪烁的效果  一次性向设备DC上输出

例如 我在写魔塔项目的时候 

每隔50毫秒刷新绘制一次地图 

绘制的方法很简单 

调用定时器使用默认的VM_TIMER的消息

 
VM_TIMER:
        hdc = Getdc(hwnd, &ps); 

	// 1.(申请缓存空间) 创建缓存DC
	mdc = CreateCompatibleDC(hdc);

	// 2.(加载数据到缓存) 通过 Hbitmap 加载数据到 缓存DC
	hbmp = (HBITMAP)LoadImage( ... );
	SelectObject(mdc, hbmp);

	// 3.(将缓存中的数据写入到目标内存) 将缓存DC中的位图复制到窗口DC上
	BitBlt( ... );

	DeleteObject(hbmp);
	DeleteDC(mdc);


即每隔定时器的事件间隔 刷新位图;

这样是可以进行一个动态的 但是有个缺点 就是没次刷新的时候都会向翻书一样有个白色的痕迹不会向动画片那么流畅

这个是在两个位图之间进行一个转换的时候 中间刷新的部分会很明显

现在是这样的一个图片


由于内存dc映射到显示器上是要消化时间的 那么也就意味着 内存dc 是有次序映射的

因此照成了图片的闪烁

双缓存不是这样 



这样就不会产生闪烁的效果 而是一个整体输出到显示器上

void show(HDC hwnd)

{    

// 1.(申请缓存空间) 创建缓存DC mdc = CreateCompatibleDC(NULL); // 2.(加载数据到缓存) 通过 Hbitmap 加载数据到 缓存DC hbmp = (HBITMAP)LoadImage( ... ); SelectObject(mdc, hbmp); // 3.(将缓存中的数据写入到目标内存) 将缓存DC中的位图复制到窗口DC上 BitBlt( ... ); DeleteObject(hbmp); DeleteDC(mdc);}
VM_TIMER:
        hdc = Getdc(hwnd, &ps); 

	// 1.(申请缓存空间) 创建缓存DC
	dcmem = CreateCompatibleDC(hdc);
        HBITMAP Hbitmap = CreateCompatibleBitmap(Hdc, 1000, 1000);
	SelectObject(dcmem, Hbitmap);
        // 2.(加载数据到缓存) 通过 Hbitmap 加载数据到 dcmem的缓存dc上
        show(dcmem);
	// 3.(将缓存中的数据写入到目标内存) 将缓存DC中的位图复制到窗口DC上
	BitBlt( ... );

	DeleteObject(hbmp);
	DeleteDC(mdc);


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值