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

引言
本文讨论如何在不使用双缓冲的情况下实现无闪烁的绘图。
解释
图片显示一个窗口,绘制了4个重叠的矩形,并且始终位于右下角。如果不使用双缓冲,当调整窗口大小时,会出现闪烁现象。
这是绘图顺序(正常方式)
每次绘制操作都会覆盖之前的绘制,因此会闪烁,因为存在重叠部分。如果我们能够绘制没有重叠部分,并像这样反转绘图顺序
没有重叠部分,因此永远不会闪烁。但是我们如何绘制非矩形部分呢?使用函数 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 排除该矩形区域以进行绘制,最后绘制背景,这样就可以实现无闪烁效果。