我正在尝试在Windows移动应用程序中实现双缓冲绘图。但我仍然看到闪烁。我在我的渲染代码中使用InvalidateRect()(此处未显示),而不是更新整个窗口。当我更新/绘制时,此API中提到的矩形会闪烁。请帮忙
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
//hdc = GetDC(hWnd);
HDC newDC = CreateCompatibleDC(hdc);
HBITMAP hBitmap;
hBitmap = CreateCompatibleBitmap(hdc,width, height);
SelectObject(newDC,hBitmap));
BitBlt(hdc,0,0,width, height,newDC,0,0,SRCCOPY);
DeleteDC(newDC);
DeleteObject(hBitmap);
EndPaint(hWnd, &ps);
//ReleaseDC(hWnd,hdc); //Using this causes WM_PAIN fired without any reason.
}
break;
答案 0 :(得分:2)
BeginPaint
删除无效rect的背景,这可能就是为什么你会发出闪烁的声音。如果您注册了相关窗口的类,则可以将背景画笔设置为GetStockObject
(NULL_BRUSH)
。
作为旁注,只要您通过调用ValidateRect
重新验证无效矩形,就可以使用GetDC
/ ReleaseDC
。
答案 1 :(得分:1)
还要确保在处理WM_PAINT后返回0。如果函数稍后执行return DefWindowProc()
或返回非0(即在对话框中),则默认窗口代码也将处理WM_PAINT,从而导致闪烁。
答案 2 :(得分:0)
我不知道这个答案是否与C ++相关,但是为了防止.Net中的闪烁,你还需要覆盖控件的OnPaintBackground事件。