Wednesday, 15 May 2013

C++: Avoid flickering using WM_ERASEBKGND-Message in MFC-Application -



C++: Avoid flickering using WM_ERASEBKGND-Message in MFC-Application -

in ondraw()-method create bitmap , blit output every time window size changes:

void cmbmview::ondraw(cdc* pdc) { crect windowsize; hdc hdc; bitmapinfo pbmi; hbitmap hbm; cbitmap *pbitmap; cdc memdc; void* ppvbits; getclientrect(windowsize); hdc = createdc (text ("display"), null, null, null) ; memset(&pbmi, 0, sizeof(bitmapinfo)); pbmi.bmiheader.bisize = sizeof(bitmapinfoheader); pbmi.bmiheader.biwidth = windowsize.width(); pbmi.bmiheader.biheight = -windowsize.height(); // top downwards pbmi.bmiheader.biplanes = 1; pbmi.bmiheader.bibitcount = 32; pbmi.bmiheader.bicompression = bi_rgb; hbm = createdibsection(hdc, &pbmi, dib_rgb_colors, &ppvbits, null, null); pbitmap = cbitmap::fromhandle(hbm); memdc.createcompatibledc(pdc); memdc.selectobject(pbitmap); // "draw" ppvbits getdocument()->drawapple(pdc, ppvbits, windowsize.width(), windowsize.height(), m_maxiter, m_maxbetragquadrat, m_bw); // blit output pdc->bitblt(0, 0, windowsize.width(), windowsize.height(), &memdc, 0, 0, srccopy); }

but every time application needs recreate bitmap in ondraw(), screen gets white until blits bitmap screen. how can utilize wm_erasebkgnd-message avoid flickering?

i don't know mfc native windows api have process wm_erasebkgnd message , return true;. tells default window procedure message processed hence window background erased. result flickering disappears.

additionally if you're using function invalidaterect(..) sure set parameter berase false. note parameter true default if not explicitly given.

c++ mfc erase blit bitblit

No comments:

Post a Comment