Windows Mobile双缓冲不起作用。仍然闪烁着

时间:2009-08-17 19:46:09

标签: winapi visual-c++ windows-mobile

我正在尝试在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;

3 个答案:

答案 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事件。