GDI + C ++中的双缓冲

我现在还没有用GDI写过任何东西(而且从来没有用过GDI +),而我只是在开发一个有趣的项目,但在我的生活中,我无法弄清楚如何将缓冲区GDI +

void DrawStuff(HWND hWnd) {
    HDC          hdc;
    HDC          hdcBuffer;
    PAINTSTRUCT  ps;
    hdc = BeginPaint(hWnd, &ps);
    hdcBuffer = CreateCompatibleDC(hdc);
    Graphics graphics(hdc);
    graphics.Clear(Color::Black);

    // drawing stuff, i.e. bunnies:

    Image bunny(L"bunny.gif");
    graphics.DrawImage(&bunny, 0, 0, bunny.GetWidth(), bunny.GetHeight());  

    BitBlt(hdc, 0,0, WIDTH , HEIGHT, hdcBuffer, 0,0, SRCCOPY);
    EndPaint(hWnd, &ps);
}

上述作品(一切都完美呈现),但它闪烁。 如果我更改Graphics graphics(hdc); Graphics graphics(hdcBuffer); ,我什么都看不到(尽管我应该在底部找到buffer-> hWnd hdc)。

我的消息管道设置正确(WM_PAINT调用DrawStuff),并且我通过调用RedrawWindow(window, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);每个程序循环中强制WM_PAINT消息RedrawWindow(window, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);

我可能会采取错误的方式来做到这一点,任何想法? MSDN文档充其量是神秘的。


CreateCompatibleDC(hdc)创建一个具有1x1像素单色位图作为其绘图表面的DC。 如果需要比此更大的绘图表面,则还需要CreateCompatibleBitmap并将该位图选择到hdcBuffer中。

编辑:

当你这样做时,闪烁是由WM_ERASEBKGND引起的

hdc = BeginPaint(hWnd, &ps);

在调用BeginPaint的过程中,Windows在发送WM_ERASEBKGND消息时,如果它认为背景需要重绘,如果你没有处理该消息,则DefWindowProc通过用你的类刷子填充颜色矩形来处理它,所以为了避免闪烁,你应该处理它并返回TRUE。

case WM_ERASEBKGND:
   return TRUE; // tell Windows that we handled it. (but don't actually draw anything)

Windows认为你的背景应该被删除,因为你告诉它它应该,这就是RDW_ERASE意思,所以你应该把你的背景放在你的RedrawWindow调用中


你可以尝试以下方法...

void DrawAll(CDC *pDC)
{
    CRect rect;
    GetClientRect(&rect);

    Bitmap *pMemBitmap = new Bitmap(rect.Width(), rect.Height());

    Graphics* pMemGraphics = Graphics::FromImage(pMemBitmap);

    Graphics graphics(pDC->m_hDC);

    // use pMemGraphics  do something....

    Status status;  
    if ((status = graphics.DrawImage(pMemBitmap, 0, 0)) !=Ok)
    {
        //some error
    }

   delete pMemGraphics;
}

你在处理WM_ERASEBKGND吗? 我相信它会在WM_PAINT之前被调用,并且通常会使窗口的背景颜色闪烁,而您可能不希望发生这种情况。

链接地址: http://www.djcxy.com/p/50299.html

上一篇: GDI+ double buffering in C++

下一篇: Drawing in window while resizing leaves Unpainted border