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