By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,213 Members | 1,117 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,213 IT Pros & Developers. It's quick & easy.

Problem with PictureBox flickering.

P: n/a
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
Nov 21 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
"Ryan Chavez" <rt******@hotmail.com> schrieb
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

Nov 21 '05 #2

P: n/a
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.BackCo lor). I'm gonna
look into overridding the OnPaintBackground and OnPaint events to see if
that will help. Thanks again.

Ryan
"Armin Zingler" <az*******@freenet.de> wrote in message
news:e8**************@TK2MSFTNGP09.phx.gbl...
"Ryan Chavez" <rt******@hotmail.com> schrieb
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

Nov 21 '05 #3

P: n/a
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
Nov 21 '05 #4

P: n/a
"Sarika" <Sa****@discussions.microsoft.com> schrieb
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

Nov 21 '05 #5

P: n/a
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
Nov 21 '05 #6

P: n/a
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.
Nov 21 '05 #7

P: n/a
"Sarika" <Sa****@discussions.microsoft.com> schrieb
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

Nov 21 '05 #8

P: n/a
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.
Nov 21 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.