GDI+ double buffering in C++

前端 未结 4 684
灰色年华
灰色年华 2020-12-13 23:09

I haven\'t written anything with GDI for a while now (and never with GDI+), and I\'m just working on a fun project, but for the life of me, I can\'t figure out how to double

相关标签:
4条回答
  • 2020-12-13 23:46

    CreateCompatibleDC(hdc) creates a DC with a 1x1 pixel monochrome bitmap as its drawing surface. You need to also CreateCompatibleBitmap and select that bitmap into the hdcBuffer if you want a drawing surface larger than that.

    Edit:

    the flickering is being caused by WM_ERASEBKGND, when you do this

    hdc = BeginPaint(hWnd, &ps);
    

    Inside the call to BeginPaint, Windows sends your WndProc a WM_ERASEBKGND message if it thinks the background needs to be redrawn, if you don't handle that message, then DefWindowProc handles it by filling the paint rectangle with your class brush, so to avoid the flickering, you should handle it and return TRUE.

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

    Windows thinks your background should be erased because you tell it that it should, that's what RDW_ERASE means, so you should probably leave that out of your RedrawWindow call

    0 讨论(0)
  • 2020-12-13 23:47

    Are you handling WM_ERASEBKGND? I believe it gets called right before WM_PAINT and usually blits the window's background color which you probably don't want to happen.

    0 讨论(0)
  • 2020-12-13 23:47

    Given "Graphics graphics(hdc)", you seem to be clearing hdc instead of hdcBuffer. Sure enough, that will cause flicker.

    0 讨论(0)
  • 2020-12-13 23:54

    you can try following way...

    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;
    }
    
    0 讨论(0)
提交回复
热议问题