65.9K
CodeProject 正在变化。 阅读更多。
Home

无需双缓冲即可实现无闪烁绘图

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.17/5 (19投票s)

2008年9月6日

CPOL
viewsIcon

33728

downloadIcon

724

无需双缓冲即可实现无闪烁绘图

引言

本文讨论如何在不使用双缓冲的情况下实现无闪烁的绘图。

解释

图片显示一个窗口,绘制了4个重叠的矩形,并且始终位于右下角。如果不使用双缓冲,当调整窗口大小时,会出现闪烁现象。
这是绘图顺序(正常方式)
do.gif
每次绘制操作都会覆盖之前的绘制,因此会闪烁,因为存在重叠部分。如果我们能够绘制没有重叠部分,并像这样反转绘图顺序
dv.gif
没有重叠部分,因此永远不会闪烁。但是我们如何绘制非矩形部分呢?使用函数 ExcludeClipRect,绘制一个矩形,调用 ExcludeClipRect 排除这个矩形,这样下一次绘制就不会覆盖这个区域,因此没有重叠部分,也不会闪烁。

使用代码

首先,在 WM_ERASEBKGND 中,只需返回 TRUE。然后在 WM_PAINT 中

		case WM_PAINT:
		{
			PAINTSTRUCT ps;
			RECT rc,rcDraw;

			GetClientRect(hwnd,&rc);
			BeginPaint(hwnd,&ps);
			
			for(int i=0;i<4;i++)
			{
				rcDraw.left = rc.right - 200 - 50*i;
				rcDraw.right = rc.right - 50*i;
				rcDraw.top = rc.bottom - 200 - 50*i;
				rcDraw.bottom = rc.bottom - 50*i;
				FillRect(ps.hdc,&rcDraw,g_brushRect[i]);
				ExcludeClipRect(ps.hdc,rcDraw.left,rcDraw.top,rcDraw.right,rcDraw.bottom);
			}
			FillRect(ps.hdc,&rc,g_brushBkg);
			EndPaint(hwnd,&ps);
			return 0;
		}
		

每次绘制一个矩形时,调用 ExcludeClipRect 排除该矩形区域以进行绘制,最后绘制背景,这样就可以实现无闪烁效果。

© . All rights reserved.