【问题标题】:Double Buffering? Win32 c++双缓冲? Win32 C++
【发布时间】:2012-12-18 16:04:42
【问题描述】:

我正在尝试实现双缓冲,但它似乎不起作用,即图形仍然闪烁。

每次鼠标移动时都会调用 WM_PAINT。 (WM_MOUSEMOVE)

在下面粘贴 WM_PAINT:

case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            RECT rect;
            GetClientRect(hWnd, &rect);
            int width=rect.right;
            int height=rect.bottom;

            HDC backbuffDC = CreateCompatibleDC(hdc);

            HBITMAP backbuffer = CreateCompatibleBitmap( hdc, width, height);

            int savedDC = SaveDC(backbuffDC);
            SelectObject( backbuffDC, backbuffer );
            HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
            FillRect(backbuffDC,&rect,hBrush);
            DeleteObject(hBrush);


            if(fileImport)
            {
                importFile(backbuffDC);
            }

            if(renderWiredCube)
            {
                wireframeCube(backbuffDC);
            }

            if(renderColoredCube)
            {
                renderColorCube(backbuffDC);

            }

            BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
            RestoreDC(backbuffDC,savedDC);

            DeleteObject(backbuffer);
            DeleteDC(backbuffDC);

            EndPaint(hWnd, &ps);
        }

【问题讨论】:

    标签: c++ gdi win32gui


    【解决方案1】:

    添加以下处理程序:

    case WM_ERASEBKGND:
        return 1;
    

    之所以起作用,是因为此消息是在绘制之前发送的,以确保在窗口类的背景上完成绘制。闪烁在背景和上面绘制的内容之间来回切换。一旦背景停止绘制,它就不再与在其上绘制的内容发生冲突,其中包括用纯色填充窗口,因此无论如何仍然会有背景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2011-03-05
      • 2011-10-16
      • 2021-04-28
      • 2012-02-11
      • 2023-02-04
      • 2011-12-08
      相关资源
      最近更新 更多