关于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);


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

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

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

现在是这样的一个图片

关于win32双缓存绘制_第1张图片

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

因此照成了图片的闪烁

双缓存不是这样 

关于win32双缓存绘制_第2张图片


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

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);


你可能感兴趣的:(windowapi)