【问题标题】:Windows Mobile double bufferring does not work. Still flickersWindows Mobile 双缓冲不起作用。仍然闪烁
【发布时间】:2010-11-20 08:58:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    BeginPaint 删除无效矩形的背景,这可能就是你看到闪烁的原因。如果有问题的窗口的类是你注册的,可以将背景画笔设置为GetStockObject(NULL_BRUSH)

    附带说明,您可以使用GetDC/ReleaseDC,只要您通过调用ValidateRect 重新验证无效矩形。

    【讨论】:

      【解决方案2】:

      还要确保在处理 WM_PAINT 后返回 0。如果函数稍后执行 return DefWindowProc() 或返回非 0(即在对话框中),默认窗口代码也会处理 WM_PAINT 并因此导致闪烁。

      【讨论】:

        【解决方案3】:

        我不知道这个答案是否与 C++ 相关,但为了防止在 .Net 中闪烁,您还需要覆盖控件的 OnPaintBackground 事件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-30
          • 2015-05-01
          • 2019-06-12
          • 1970-01-01
          • 2013-01-12
          • 2018-11-15
          • 2011-01-22
          相关资源
          最近更新 更多