Problem with PictureBox flickering.

R

Ryan Chavez

Hello,

I'm working on a project that basically draws lines onto a PictureBox control. Now I'm using a Timer with an interval of 100 to draw the information. Now my code looks something like this:

Private Sub Draw()
m_pPictBox.Refresh()
' Draw etc...
End Sub
Private Sub m_pTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_pTimer.Tick
Draw()
End Sub
Now, everytime the Draw function gets called, I see the drawing "flicker" (ie flash on/off) in the PictureBox. I've tried using m_pPictBoxGraphics.Clear(Color.Gray) (or any other color) but it still causes it to flicker.
Any suggestions would be most helpful. Thank you.
Ryan
 
A

Armin Zingler

Ryan Chavez said:
Hello,

I'm working on a project that basically draws lines onto a PictureBox
control. Now I'm using a Timer with an interval of 100 to draw the
information. Now my code looks something like this:

Private Sub Draw()
m_pPictBox.Refresh()
' Draw etc...

Why do you call Refresh before drawing?
End Sub
Private Sub m_pTimer_Tick(ByVal sender As Object, ByVal e As
System.EventArgs) Handles m_pTimer.Tick
Draw()
End Sub
Now, everytime the Draw function gets called, I see the drawing
"flicker" (ie flash on/off) in the PictureBox. I've tried using
m_pPictBoxGraphics.Clear(Color.Gray) (or any other color) but it
still causes it to flicker. Any suggestions would be most helpful.
Thank you.
Ryan

You might consider inheriting from the picturebox and call the SetStyle
method to enable double buffering:

In the constructor:

setstyle( _
ControlStyles.AllPaintingInWmPaint _
Or ControlStyles.DoubleBuffer _
Or ControlStyles.UserPaint, _
True _
)

I'd also suggest to override the OnPaintBackground and OnPaint methods and
paint everything there. You can leave OnPaintBackground empty and also clear
the background in OnPaint, so you have all the rendering in one place. In
the Form hosting the new control, you can call it's Invalidate method
whenever you want it to be repainted.

Armin
 
R

Ryan Chavez

Thank you Armin. I created a class that inherited the PictureBox and did
like you suggested with the SetStyle in the constructure and it worked
really good. I still get a small amout of flicker but not nearly as much as
before. I also don't use m_pPictureBox.Refresh() anymore since I went back
to using m_pPictBoxGraphics.Clear(m_pPictBoxGraphics.BackColor). I'm gonna
look into overridding the OnPaintBackground and OnPaint events to see if
that will help. Thanks again.

Ryan
 
G

Guest

Hello,

I am facing a similar problem. I have a MDI form with another form as the
MDI Client. The client has a Panel control on which I draw stuff. I noticed
that there is a lot of flikering when I draw anything.

As per the earlier suggestion I added the following code to the MDI client's
code. However the problem still persists.
///
InitializeComponent()

Me.SetStyle(ControlStyles.DoubleBuffer Or _
ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.UserPaint Or _
ControlStyles.Opaque, True)

Me.UpdateStyles()

\\\

Any suggestions??

TIA
 
A

Armin Zingler

Sarika said:
Hello,

I am facing a similar problem. I have a MDI form with another form as
the MDI Client. The client has a Panel control on which I draw
stuff. I noticed that there is a lot of flikering when I draw
anything.

As per the earlier suggestion I added the following code to the MDI
client's code. However the problem still persists.
///
InitializeComponent()

Me.SetStyle(ControlStyles.DoubleBuffer Or _
ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.UserPaint Or _
ControlStyles.Opaque, True)

Me.UpdateStyles()

\\\

Any suggestions??

TIA


If the panel is flickering the style of the panel must be changed. As
SetStyle is protected, it has to be done in a control inherited from Panel.


Armin
 
G

Guest

Hi Armin,

Well I tried that too. I tried the SetStyle method for the Panel instead of
the form and it did not work.

However I am not sure I understand you when you said
"As SetStyle is protected, it has to be done in a control inherited from
Panel"

I don't have any control that inherits from the Panel. The Panel acts as the
drawing area and a container for a textbox
 
G

Guest

Armin,

In my earlier post I mentioned that I tred the double buffering w/ the
Panel. Well I actually just tried with the form and did not realise it
because of the syntax was for the form and hence it did not raise a flag.

Anyways. So regarding your suggestion....

I need to create a class which inherits the Panel class and set the
properties there. I then use this class to create a Panel on which I will do
my drawing.

Did I get you right?

Just an observation

I draw lines, text, boxes and also drag and drop some images from my
treeview control. I noticed that drawing the Lines causes NO flicker whereas
drawing any other object or moving it causes some flicker.

Maybe you will be able to shed some light on this.

Thanks again for your reponse.
 
A

Armin Zingler

Sarika said:
Armin,

In my earlier post I mentioned that I tred the double buffering w/
the Panel. Well I actually just tried with the form and did not
realise it because of the syntax was for the form and hence it did
not raise a flag.

Anyways. So regarding your suggestion....

I need to create a class which inherits the Panel class and set the
properties there. I then use this class to create a Panel on which I
will do
my drawing.

Did I get you right?

I don't understand "I then use this class...". The class *is* a panel.
Replace the current panel by an instance of the new class. Unfortunatelly,
the IDE doesn't add it automatically to the toolbox like it does with
Usercontrols.
Just an observation

I draw lines, text, boxes and also drag and drop some images from my
treeview control. I noticed that drawing the Lines causes NO flicker
whereas
drawing any other object or moving it causes some flicker.

Maybe you will be able to shed some light on this.

Thanks again for your reponse.


Do you draw inside the Panel's OnPaint method?



Armin
 
G

Guest

Okay I think I understand what you are saying with the inheritance.

I call a DrawAll method inside the Panel's Paint event. This DrawAll method
in turn calls the ClassPaint method of each of the classes whose objects need
to be drawn on the screen.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top