[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 252
  • Last Modified:

Flikering

I am working on istrument interfacing project on VC++ 6.0.
in which i am showing differerent displayes like grpah ,tabular,analog,digital.
i am using bitblt function to draw background of grah & platting graoh in onDraw with linto moveto function.
i am invalidating area bounded by x- y axis of graph.
Then also i am getting flikering,
can anybody will suggest me how to go for this problem.
0
jaydeep
Asked:
jaydeep
  • 3
  • 3
  • 2
1 Solution
 
bertpCommented:
two suggestions

first and easiest:
override the CWnd::OnEraseBkgnd()mesage;
afx_msg BOOL OnEraseBkgnd( CDC* pDC )
simply return TRUE to tell
windows to not erase the client area
before you draw.  this might be sufficient for you...

second if you still see flicker aand you have confirmed that your OnEraseBkgrnd is being called and is  returning a nonzero value.. then you shoud draw instead to a memory DC instead of to a window dc..
after you have finished building your memory dc, just blit the memory dc to the window dc....

In case you need it I have found an explicit example with explanation at:
http://codeguru.developer.com/misc/flicker_free_drawing.shtml

good luck


 
0
 
jaydeepAuthor Commented:
hi!
i tried erase background,if i override
that & return true it doesn't do anything.it doesn't paint at all
one more thing i am arealy using bilblt
using memory DC.i will explain you what io am doing.
1.i am drawing on memedc(that bkgroung og graph
2.draeong(plaotting graph in ondraw))
3.to show updated regoin i have to invalidate bounded rect by x-y.
4. so that invalidted region flikers.

i ahve seen one example in MSDN help.
a cor moving ,there is tree behind it.it doesn't fliker at all,even yoy can see tree through car window,there is not at all flokering.they have used masking,i did not uderstand it.

one more thing the rate at which i am getting reading from intruments is 10 raedings/sec
0
 
bertpCommented:
hmmm, I used this technique back in the days of  c & the sdk and it worked fine so I would  suspect that it has something to do with the doc/view system of MFC... except that the example in the link I posted specifically mentions a view...

guessing bigtime here,  perhaps you are rendering only a portion but redrawing the whole view with a MemDC that is mostly the background color...  see what happens if you rerender the whole view each time and redraw the whole view with each OnDraw... If this works then you can continue on a figure out why you cannot draw just the portion. But unless your view requires alot of
complex calculations or disk access it will probably be just as flicker-free to redraw the whole view on each OnDraw()
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
bertpCommented:
Hi
  If you're still having trouble you should consider rejecting my answer so that you can again get help from others
Good Luck!
0
 
leandrobeckerCommented:
First:

Only return TRUE when receive the WM_ERASEBKGND:

Example

BOOL CYourWnd::OnEraseBkgnd(CDC* pDC)
{
      return FALSE;
}

Second:

In your paint function use a memory DC like this:

void CYourWnd::OnPaint()
{
      CPaintDC dc(this); // device context for painting
      CDC memDC;
      CBitmap bitMem,*bitOld;
        CRect rect;
        GetClientRect(&rect);

      memDC.CreateCompatibleDC(&dc);

      
bitMem.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());

      bitOld = memDC.SelectObject(&bitMem);

       memDC.FillSolidRect(&rect,0x00FFFFFF);
      
      //do your paints using memDC

      dc.BitBlt(0,0,rect.Width(), rect.Height()),&memDC,0,0,SRCCOPY);

      memDC.SelectObject(OldFont);
      memDC.SelectObject(bitOld);
}
0
 
jaydeepAuthor Commented:
hi!
thanks for help.
i could solve this problem,
There was problem with sequence of function call.

Now i am i am not erasing present background i am calling Invalidate(FALSE)
 & where i need immidiate refelction of change i am calling UpdateWindow,which
calls WM_PAINT with priority,
this solved my problem

thanks for help
0
 
leandrobeckerCommented:
HI jaydeep

If the answer has helped you, please
select it how the answer for you question. Thanks
0
 
jaydeepAuthor Commented:
i have already solved the problem ,
thanks for help.

jaydeep
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 3
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now