No he escrito nada con GDI por un tiempo ahora (y nunca con GDI+), y estoy trabajando en un proyecto de la diversión, pero para la vida de mí, no puedo entender cómo a haga doble búfer de 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);
}

El anterior funciona (todo lo hace a la perfección), pero parpadea. Si me cambio de Graphics graphics(hdc); a Graphics graphics(hdcBuffer);, yo no veo nada (aunque debo ser bitblt ing el buffer->hWnd de la hdc en la parte inferior).

Mi mensaje tubería está configurado correctamente (WM_PAINT llamadas DrawStuff), y estoy forzando un mensaje WM_PAINT cada circuito del programa llamando RedrawWindow(window, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);

Que probablemente voy sobre la manera incorrecta de hacer esto, alguna idea? La documentación de MSDN es críptico, en el mejor.

OriginalEl autor David Titarenco | 2010-03-18

3 Comentarios

  1. 7

    CreateCompatibleDC(hdc) crea un DC con un 1×1 píxel del mapa de bits monocromo como su superficie de dibujo. También es necesario CreateCompatibleBitmap y seleccione el mapa de bits en el hdcBuffer si desea una superficie de dibujo más grande que eso.

    Edición:

    el parpadeo causado por WM_ERASEBKGND, al hacer esto

    hdc = BeginPaint(hWnd, &ps);

    Dentro de la llamada a BeginPaint, Windows envía el WndProc un WM_ERASEBKGND mensaje si se piensa que el fondo debe ser redibujado, si no se manejan ese mensaje, DefWindowProc controla mediante la cumplimentación de la pintura rectángulo con su clase de pincel, por lo que para evitar el parpadeo, debe manejar y devolver TRUE.

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

    Windows piensa que su fondo debe ser borrado porque se diga lo que debe, que es lo que RDW_ERASE significa, entonces usted probablemente debería dejar que se fuera de su RedrawWindow llamada

    Gracias, he añadido hBmp = CreateCompatibleBitmap(hdc,ANCHO,alto); SelectObject(hdcBuffer, hBmp); el código (y la BitBlt obras), pero aún parpadea.

    OriginalEl autor John Knoeller

  2. 2

    puede intentar la siguiente manera…

    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;
    }
    Por favor, añadir una descripción para su código, para una mejor explicación de la solución. estamos aquí para aprender cómo llegar a las respuestas que la próxima vez que nos encontramos con este problema, no se cómo copiar de ellos.
    No esta fuga de la pMemBitmap?

    OriginalEl autor ali hwang

  3. 1

    Son de manejo WM_ERASEBKGND? Creo que se llama justo antes de WM_PAINT y generalmente volcados la ventana del color de fondo que usted probablemente no quiere que suceda.

    OriginalEl autor C. Dragon 76

Dejar respuesta

Please enter your comment!
Please enter your name here